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 5226ac57e3c..6ac28943634 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. @@ -81,19 +81,42 @@ public abstract class ProgressUpdateEvent extends UpdateEvent { /** * 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()} */ - public long getCurrent() { - return this.current; + @Deprecated(since = "3.3.7", forRemoval = true) + public int getCurrent() { + 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()} */ - public long getTotal() { - return this.total; + @Deprecated(since = "3.3.7", forRemoval = true) + public int getTotal() { + 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 fa397c611f5..b81cfb85a36 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 @@ public abstract class TotalProgressListener } 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 @@ public abstract class TotalProgressListener } 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 063e17ffc3a..dd43af82899 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. @@ -39,17 +39,21 @@ abstract class ProgressUpdateEventTests { } @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(4000000000L); - assertThat(event.getProgressDetail().getTotal()).isEqualTo(8000000000L); + assertThat(event.getProgressDetail().getCurrent()).isEqualTo(Integer.MAX_VALUE); + assertThat(event.getProgressDetail().getTotal()).isEqualTo(Integer.MAX_VALUE); + assertThat(event.getProgressDetail().asPercentage()).isEqualTo(50); } @Test @@ -59,18 +63,21 @@ abstract class ProgressUpdateEventTests { } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenCurrentIsNullReturnsTrue() { ProgressDetail detail = new ProgressDetail(null, 2L); assertThat(ProgressDetail.isEmpty(detail)).isTrue(); } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenTotalIsNullReturnsTrue() { ProgressDetail detail = new ProgressDetail(1L, null); assertThat(ProgressDetail.isEmpty(detail)).isTrue(); } @Test + @SuppressWarnings("removal") void progressDetailIsEmptyWhenTotalAndCurrentAreNotNullReturnsFalse() { ProgressDetail detail = new ProgressDetail(1L, 2L); assertThat(ProgressDetail.isEmpty(detail)).isFalse(); 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 79bb5fd97bd..7c95f9bcbd0 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 @@ import static org.assertj.core.api.Assertions.assertThat; 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 @@ class PullUpdateEventTests extends AbstractJsonTests { 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"); }