diff --git a/src/main/java/net/jodah/sarge/Directive.java b/src/main/java/net/jodah/sarge/Directive.java index 7c27f62..3ab2e97 100644 --- a/src/main/java/net/jodah/sarge/Directive.java +++ b/src/main/java/net/jodah/sarge/Directive.java @@ -1,7 +1,8 @@ package net.jodah.sarge; import net.jodah.sarge.internal.RetryDirective; -import net.jodah.sarge.util.Duration; + +import java.time.Duration; /** * Determine how failures should be handled. diff --git a/src/main/java/net/jodah/sarge/PlanMaker.java b/src/main/java/net/jodah/sarge/PlanMaker.java index 52495e4..fbccb38 100644 --- a/src/main/java/net/jodah/sarge/PlanMaker.java +++ b/src/main/java/net/jodah/sarge/PlanMaker.java @@ -1,11 +1,11 @@ package net.jodah.sarge; +import net.jodah.sarge.internal.util.Assert; + +import java.time.Duration; import java.util.LinkedHashMap; import java.util.Map; -import net.jodah.sarge.internal.util.Assert; -import net.jodah.sarge.util.Duration; - /** * Makes a {@link Plan}. * diff --git a/src/main/java/net/jodah/sarge/Plans.java b/src/main/java/net/jodah/sarge/Plans.java index 572ea85..774aeb7 100644 --- a/src/main/java/net/jodah/sarge/Plans.java +++ b/src/main/java/net/jodah/sarge/Plans.java @@ -1,6 +1,6 @@ package net.jodah.sarge; -import net.jodah.sarge.util.Duration; +import java.time.Duration; /** * Defines a strategy for supervising objects. diff --git a/src/main/java/net/jodah/sarge/internal/RetryDirective.java b/src/main/java/net/jodah/sarge/internal/RetryDirective.java index b55f134..c2b2f9e 100644 --- a/src/main/java/net/jodah/sarge/internal/RetryDirective.java +++ b/src/main/java/net/jodah/sarge/internal/RetryDirective.java @@ -1,7 +1,8 @@ package net.jodah.sarge.internal; import net.jodah.sarge.Directive; -import net.jodah.sarge.util.Duration; + +import java.time.Duration; /** * Directive that encapsulates retry information. diff --git a/src/main/java/net/jodah/sarge/util/Duration.java b/src/main/java/net/jodah/sarge/util/Duration.java deleted file mode 100644 index 9c4c062..0000000 --- a/src/main/java/net/jodah/sarge/util/Duration.java +++ /dev/null @@ -1,210 +0,0 @@ -package net.jodah.sarge.util; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.regex.Pattern; - -import net.jodah.sarge.internal.util.Assert; - -/** - * Adapted from com.yammer.dropwizard.uti.Duration. - */ -public class Duration { - static final Pattern PATTERN = Pattern.compile("[\\d]+[\\s]*(" + "ns|nanosecond(s)?|" - + "us|microsecond(s)?|" + "ms|millisecond(s)?|" + "s|second(s)?|" + "m|minute(s)?|" - + "h|hour(s)?|" + "d|day(s)?" + ')'); - private static final Map SUFFIXES; - private static final Duration INFINITE = new Duration(); - - static { - SUFFIXES = new HashMap(); - - SUFFIXES.put("ns", TimeUnit.NANOSECONDS); - SUFFIXES.put("nanosecond", TimeUnit.NANOSECONDS); - SUFFIXES.put("nanoseconds", TimeUnit.NANOSECONDS); - - SUFFIXES.put("us", TimeUnit.MICROSECONDS); - SUFFIXES.put("microsecond", TimeUnit.MICROSECONDS); - SUFFIXES.put("microseconds", TimeUnit.MICROSECONDS); - - SUFFIXES.put("ms", TimeUnit.MILLISECONDS); - SUFFIXES.put("millisecond", TimeUnit.MILLISECONDS); - SUFFIXES.put("milliseconds", TimeUnit.MILLISECONDS); - - SUFFIXES.put("s", TimeUnit.SECONDS); - SUFFIXES.put("second", TimeUnit.SECONDS); - SUFFIXES.put("seconds", TimeUnit.SECONDS); - - SUFFIXES.put("m", TimeUnit.MINUTES); - SUFFIXES.put("minute", TimeUnit.MINUTES); - SUFFIXES.put("minutes", TimeUnit.MINUTES); - - SUFFIXES.put("h", TimeUnit.HOURS); - SUFFIXES.put("hour", TimeUnit.HOURS); - SUFFIXES.put("hours", TimeUnit.HOURS); - - SUFFIXES.put("d", TimeUnit.DAYS); - SUFFIXES.put("day", TimeUnit.DAYS); - SUFFIXES.put("days", TimeUnit.DAYS); - } - - private final long count; - private final TimeUnit unit; - private final boolean finite; - - private Duration() { - this.count = Long.MAX_VALUE; - this.unit = TimeUnit.DAYS; - finite = false; - } - - private Duration(long count, TimeUnit unit) { - this.count = count; - this.unit = Assert.notNull(unit); - finite = true; - } - - public static Duration of(long count, TimeUnit unit) { - return new Duration(count, unit); - } - - public static Duration of(String duration) { - Assert.isTrue(PATTERN.matcher(duration).matches(), "Invalid duration: %s", duration); - int i = 0; - for (; i < duration.length(); i++) - if (Character.isLetter(duration.charAt(i))) - break; - String unit = duration.subSequence(0, i).toString().trim(); - String dur = duration.subSequence(i, duration.length()).toString(); - return new Duration(Long.parseLong(unit), SUFFIXES.get(dur)); - } - - public boolean isFinite() { - return finite; - } - - public static Duration inf() { - return INFINITE; - } - - public static Duration infinite() { - return INFINITE; - } - - public static Duration days(long count) { - return new Duration(count, TimeUnit.DAYS); - } - - public static Duration hours(long count) { - return new Duration(count, TimeUnit.HOURS); - } - - public static Duration microseconds(long count) { - return new Duration(count, TimeUnit.MICROSECONDS); - } - - public static Duration millis(long count) { - return new Duration(count, TimeUnit.MILLISECONDS); - } - - public static Duration milliseconds(long count) { - return new Duration(count, TimeUnit.MILLISECONDS); - } - - public static Duration mins(long count) { - return new Duration(count, TimeUnit.MINUTES); - } - - public static Duration minutes(long count) { - return new Duration(count, TimeUnit.MINUTES); - } - - public static Duration nanos(long count) { - return new Duration(count, TimeUnit.NANOSECONDS); - } - - public static Duration nanoseconds(long count) { - return new Duration(count, TimeUnit.NANOSECONDS); - } - - public static Duration secs(long count) { - return new Duration(count, TimeUnit.SECONDS); - } - - public static Duration seconds(long count) { - return new Duration(count, TimeUnit.SECONDS); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if ((obj == null) || (getClass() != obj.getClass())) - return false; - final Duration duration = (Duration) obj; - return (count == duration.count) && (unit == duration.unit); - - } - - @Override - public int hashCode() { - return (31 * (int) (count ^ (count >>> 32))) + unit.hashCode(); - } - - public long toDays() { - return TimeUnit.DAYS.convert(count, unit); - } - - public long toHours() { - return TimeUnit.HOURS.convert(count, unit); - } - - public long toMicros() { - return TimeUnit.MICROSECONDS.convert(count, unit); - } - - public long toMicroseconds() { - return TimeUnit.MICROSECONDS.convert(count, unit); - } - - public long toMillis() { - return TimeUnit.MILLISECONDS.convert(count, unit); - } - - public long toMilliseconds() { - return TimeUnit.MILLISECONDS.convert(count, unit); - } - - public long toMins() { - return TimeUnit.MINUTES.convert(count, unit); - } - - public long toMinutes() { - return TimeUnit.MINUTES.convert(count, unit); - } - - public long toNanos() { - return TimeUnit.NANOSECONDS.convert(count, unit); - } - - public long toNanoseconds() { - return TimeUnit.NANOSECONDS.convert(count, unit); - } - - public long toSecs() { - return TimeUnit.SECONDS.convert(count, unit); - } - - public long toSeconds() { - return TimeUnit.SECONDS.convert(count, unit); - } - - @Override - public String toString() { - String units = unit.toString().toLowerCase(); - if (count == 1) - units = units.substring(0, units.length() - 1); - return Long.toString(count) + ' ' + units; - } -} diff --git a/src/test/java/net/jodah/sarge/functional/BackoffTest.java b/src/test/java/net/jodah/sarge/functional/BackoffTest.java index e683fd6..5142ab2 100644 --- a/src/test/java/net/jodah/sarge/functional/BackoffTest.java +++ b/src/test/java/net/jodah/sarge/functional/BackoffTest.java @@ -1,14 +1,13 @@ package net.jodah.sarge.functional; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import static org.testng.Assert.fail; import net.jodah.sarge.AbstractTest; import net.jodah.sarge.Plans; -import net.jodah.sarge.util.Duration; - import org.testng.annotations.Test; +import java.time.Duration; + +import static org.testng.Assert.*; + /** * @author Jonathan Halterman */ @@ -25,7 +24,7 @@ void doSomething() { public void shouldBackoff() { Foo foo = sarge.supervised(Foo.class, Plans.retryOn(IllegalStateException.class, 5, - Duration.inf(), Duration.millis(100), Duration.millis(800))); + Duration.ofDays(1), Duration.ofMillis(100), Duration.ofMillis(800))); long startTime = System.currentTimeMillis(); diff --git a/src/test/java/net/jodah/sarge/functional/HierarchicalSupervisionTest.java b/src/test/java/net/jodah/sarge/functional/HierarchicalSupervisionTest.java index 8f76cbe..bcb5df6 100644 --- a/src/test/java/net/jodah/sarge/functional/HierarchicalSupervisionTest.java +++ b/src/test/java/net/jodah/sarge/functional/HierarchicalSupervisionTest.java @@ -6,18 +6,19 @@ import net.jodah.sarge.Plan; import net.jodah.sarge.Plans; import net.jodah.sarge.Supervisor; -import net.jodah.sarge.util.Duration; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.time.Duration; + /** * @author Jonathan Halterman */ @Test public class HierarchicalSupervisionTest extends AbstractTest { private static int counter; - private static final Plan RETRY_PLAN = Plans.retryOn(Throwable.class, 3, Duration.mins(10)) + private static final Plan RETRY_PLAN = Plans.retryOn(Throwable.class, 3, Duration.ofMinutes(10)) .make(); private static final Plan ESCALATE_PLAN = Plans.escalateOn(Throwable.class).make(); diff --git a/src/test/java/net/jodah/sarge/functional/SelfSupervisionTest.java b/src/test/java/net/jodah/sarge/functional/SelfSupervisionTest.java index 56ca1fd..f7e9744 100644 --- a/src/test/java/net/jodah/sarge/functional/SelfSupervisionTest.java +++ b/src/test/java/net/jodah/sarge/functional/SelfSupervisionTest.java @@ -1,19 +1,18 @@ package net.jodah.sarge.functional; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.fail; - -import java.util.concurrent.atomic.AtomicInteger; - import net.jodah.sarge.AbstractTest; import net.jodah.sarge.Directive; import net.jodah.sarge.Plan; import net.jodah.sarge.SelfSupervisor; -import net.jodah.sarge.util.Duration; - import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.time.Duration; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; + /** * @author Jonathan Halterman */ @@ -22,7 +21,7 @@ public class SelfSupervisionTest extends AbstractTest { private static int counter; private static final Plan RETRY_PLAN = new Plan() { public Directive apply(Throwable cause) { - return Directive.Retry(3, Duration.mins(10)); + return Directive.Retry(3, Duration.ofMinutes(10)); } }; private static final Plan ESCALATE_PLAN = new Plan() { @@ -79,7 +78,7 @@ static class FooShortRetry implements SelfSupervisor { public Plan selfPlan() { return new Plan() { public Directive apply(Throwable cause) { - return Directive.Retry(2, Duration.millis(100)); + return Directive.Retry(2, Duration.ofMillis(100)); } }; } diff --git a/src/test/java/net/jodah/sarge/internal/RetryStatsTest.java b/src/test/java/net/jodah/sarge/internal/RetryStatsTest.java index f05164e..a9549b2 100644 --- a/src/test/java/net/jodah/sarge/internal/RetryStatsTest.java +++ b/src/test/java/net/jodah/sarge/internal/RetryStatsTest.java @@ -1,12 +1,11 @@ package net.jodah.sarge.internal; +import org.testng.annotations.Test; + +import java.time.Duration; + import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; -import net.jodah.sarge.internal.RetryDirective; -import net.jodah.sarge.internal.RetryStats; -import net.jodah.sarge.util.Duration; - -import org.testng.annotations.Test; /** * @author Jonathan Halterman @@ -14,7 +13,7 @@ @Test public class RetryStatsTest { public void shouldAllowRetryWhenAttemptsNotExceeded() throws Exception { - RetryStats stats = new RetryStats(new RetryDirective(3, Duration.millis(50))); + RetryStats stats = new RetryStats(new RetryDirective(3, Duration.ofMillis(50))); assertTrue(stats.canRetry()); stats.canRetry(); stats.canRetry(); @@ -23,7 +22,7 @@ public void shouldAllowRetryWhenAttemptsNotExceeded() throws Exception { } public void shouldAllowRetryWhenAttemptsExceededOutsideOfWindow() throws Exception { - RetryStats stats = new RetryStats(new RetryDirective(3, Duration.millis(50))); + RetryStats stats = new RetryStats(new RetryDirective(3, Duration.ofMillis(50))); stats.canRetry(); stats.canRetry(); assertTrue(stats.canRetry()); @@ -34,7 +33,7 @@ public void shouldAllowRetryWhenAttemptsExceededOutsideOfWindow() throws Excepti } public void shouldNotAllowRetryWhenAttemptsExceededWithinWindow() throws Exception { - RetryStats stats = new RetryStats(new RetryDirective(3, Duration.millis(50))); + RetryStats stats = new RetryStats(new RetryDirective(3, Duration.ofMillis(50))); stats.canRetry(); assertTrue(stats.canRetry()); stats.canRetry(); diff --git a/src/test/java/net/jodah/sarge/util/DurationTest.java b/src/test/java/net/jodah/sarge/util/DurationTest.java deleted file mode 100644 index 3157c3b..0000000 --- a/src/test/java/net/jodah/sarge/util/DurationTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.jodah.sarge.util; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertTrue; -import net.jodah.sarge.util.Duration; - -import org.testng.annotations.Test; - -@Test -public class DurationTest { - public void testPattern() { - assertTrue(Duration.PATTERN.matcher("1s").matches()); - } - - public void testOf() { - assertEquals(Duration.seconds(1), Duration.of("1s")); - assertEquals(Duration.seconds(1), Duration.of("1 s")); - assertEquals(Duration.seconds(10), Duration.of("10 seconds")); - } -}