You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/11/29 13:40:18 UTC
[04/13] brooklyn-server git commit: Time.makeTimeString: avoid NPE if
arg is null
Time.makeTimeString: avoid NPE if arg is null
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/bcb96892
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/bcb96892
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/bcb96892
Branch: refs/heads/master
Commit: bcb96892991b72f7170e11b26140eff1fba8525d
Parents: aa14b84
Author: Aled Sage <al...@gmail.com>
Authored: Wed Nov 16 09:47:27 2016 +0000
Committer: Aled Sage <al...@gmail.com>
Committed: Mon Nov 28 21:11:48 2016 +0000
----------------------------------------------------------------------
.../org/apache/brooklyn/util/time/Duration.java | 6 +-
.../org/apache/brooklyn/util/time/Time.java | 74 +++++++++++++-------
.../org/apache/brooklyn/util/time/TimeTest.java | 31 +++++++-
3 files changed, 83 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bcb96892/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java b/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
index 76217a0..473aef3 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/time/Duration.java
@@ -137,8 +137,10 @@ public class Duration implements Comparable<Duration>, Serializable {
/**
* See {@link Time#parseElapsedTime(String)};
- * also accepts "forever" (and for those who prefer things exceedingly accurate, "practically_forever").
- * Also see {@link #of(Object)}. */
+ * also accepts "forever" (and for those who prefer things exceedingly accurate, "practically_forever").
+ * If null or blank or 'null' is passed in, then null will be returned.
+ * Also see {@link #of(Object)}.
+ */
public static Duration parse(String textualDescription) {
if (Strings.isBlank(textualDescription)) return null;
if ("null".equalsIgnoreCase(textualDescription)) return null;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bcb96892/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
----------------------------------------------------------------------
diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java b/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
index 89c62ad..ef445d5 100644
--- a/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
+++ b/utils/common/src/main/java/org/apache/brooklyn/util/time/Time.java
@@ -87,7 +87,7 @@ public class Time {
return makeDateString(date, format, null);
}
/** as {@link #makeDateString(Date, String, TimeZone)} for the given time zone; consider {@link TimeZone#GMT} */
- public static String makeDateString(Date date, String format, TimeZone tz) {
+ public static String makeDateString(Date date, String format, @Nullable TimeZone tz) {
SimpleDateFormat fmt = new SimpleDateFormat(format);
if (tz!=null) fmt.setTimeZone(tz);
return fmt.format(date);
@@ -101,7 +101,9 @@ public class Time {
return makeDateString(date.getTime(), format, date.getTimeZone());
}
- public static Function<Long, String> toDateString() { return dateString; }
+ public static Function<Long, String> toDateString() {
+ return dateString;
+ }
private static Function<Long, String> dateString = new Function<Long, String>() {
@Override
@Nullable
@@ -136,7 +138,9 @@ public class Time {
return new SimpleDateFormat(DATE_FORMAT_SIMPLE_STAMP).format(new Date(date));
}
- public static Function<Long, String> toDateStampString() { return dateStampString; }
+ public static Function<Long, String> toDateStampString() {
+ return dateStampString;
+ }
private static Function<Long, String> dateStampString = new Function<Long, String>() {
@Override
@Nullable
@@ -156,8 +160,11 @@ public class Time {
long nanos = unit.toNanos(t);
return makeTimeStringNanoRounded(nanos);
}
- public static String makeTimeStringRounded(Stopwatch timer) {
- return makeTimeStringRounded(timer.elapsed(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS);
+ /**
+ * A nice string representation of the stopwatch's elapsed time; or null if null is passed in.
+ */
+ public static String makeTimeStringRounded(@Nullable Stopwatch timer) {
+ return (timer == null) ? null : makeTimeStringRounded(timer.elapsed(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS);
}
/** @see #makeTimeString(long, boolean) */
public static String makeTimeStringExact(long t) {
@@ -171,13 +178,19 @@ public class Time {
public static String makeTimeStringRoundedSince(long utc) {
return makeTimeString(System.currentTimeMillis() - utc, true);
}
- /** @see #makeTimeString(long, boolean) */
- public static String makeTimeStringExact(Duration d) {
- return makeTimeStringNanoExact(d.toNanoseconds());
+ /**
+ * A nice string representation of the duration; or null if null is passed in.
+ * @see #makeTimeString(long, boolean)
+ */
+ public static String makeTimeStringExact(@Nullable Duration d) {
+ return (d == null) ? null : makeTimeStringNanoExact(d.toNanoseconds());
}
- /** @see #makeTimeString(long, boolean) */
- public static String makeTimeStringRounded(Duration d) {
- return makeTimeStringNanoRounded(d.toNanoseconds());
+ /**
+ * A nice string representation of the duration; or null if null is passed in.
+ * @see #makeTimeString(long, boolean)
+ */
+ public static String makeTimeStringRounded(@Nullable Duration d) {
+ return (d == null) ? null : makeTimeStringNanoRounded(d.toNanoseconds());
}
/** given an elapsed time, makes it readable, eg 44d 6h, or 8s 923ms, optionally rounding */
public static String makeTimeString(long t, boolean round) {
@@ -282,7 +295,9 @@ public class Time {
return Strings.removeAllFromEnd(result, " ");
}
- public static Function<Long, String> fromLongToTimeStringExact() { return LONG_TO_TIME_STRING_EXACT; }
+ public static Function<Long, String> fromLongToTimeStringExact() {
+ return LONG_TO_TIME_STRING_EXACT;
+ }
private static final Function<Long, String> LONG_TO_TIME_STRING_EXACT = new FunctionLongToTimeStringExact();
private static final class FunctionLongToTimeStringExact implements Function<Long, String> {
@Override @Nullable
@@ -292,8 +307,11 @@ public class Time {
}
}
- /** @deprecated since 0.7.0 use {@link #fromLongToTimeStringExact()} */ @Deprecated
- public static Function<Long, String> toTimeString() { return timeString; }
+ /** @deprecated since 0.7.0 use {@link #fromLongToTimeStringExact()} */
+ @Deprecated
+ public static Function<Long, String> toTimeString() {
+ return timeString;
+ }
@Deprecated
private static Function<Long, String> timeString = new Function<Long, String>() {
@Override
@@ -304,7 +322,9 @@ public class Time {
}
};
- public static Function<Long, String> fromLongToTimeStringRounded() { return LONG_TO_TIME_STRING_ROUNDED; }
+ public static Function<Long, String> fromLongToTimeStringRounded() {
+ return LONG_TO_TIME_STRING_ROUNDED;
+ }
private static final Function<Long, String> LONG_TO_TIME_STRING_ROUNDED = new FunctionLongToTimeStringRounded();
private static final class FunctionLongToTimeStringRounded implements Function<Long, String> {
@Override @Nullable
@@ -314,8 +334,11 @@ public class Time {
}
}
- /** @deprecated since 0.7.0 use {@link #fromLongToTimeStringRounded()} */ @Deprecated
- public static Function<Long, String> toTimeStringRounded() { return timeStringRounded; }
+ /** @deprecated since 0.7.0 use {@link #fromLongToTimeStringRounded()} */
+ @Deprecated
+ public static Function<Long, String> toTimeStringRounded() {
+ return timeStringRounded;
+ }
@Deprecated
private static Function<Long, String> timeStringRounded = new Function<Long, String>() {
@Override
@@ -326,7 +349,9 @@ public class Time {
}
};
- public static Function<Duration, String> fromDurationToTimeStringRounded() { return DURATION_TO_TIME_STRING_ROUNDED; }
+ public static Function<Duration, String> fromDurationToTimeStringRounded() {
+ return DURATION_TO_TIME_STRING_ROUNDED;
+ }
private static final Function<Duration, String> DURATION_TO_TIME_STRING_ROUNDED = new FunctionDurationToTimeStringRounded();
private static final class FunctionDurationToTimeStringRounded implements Function<Duration, String> {
@Override @Nullable
@@ -412,7 +437,7 @@ public class Time {
}
/** Convenience for {@link Duration#parse(String)}. */
- public static Duration parseDuration(String timeString) {
+ public static Duration parseDuration(@Nullable String timeString) {
return Duration.parse(timeString);
}
@@ -438,12 +463,13 @@ public class Time {
* -1 on blank or never or off or false.
* Assumes unit is millisections if no unit is specified.
*
- * @throws NumberFormatException if cannot be parsed (or if null)
+ * @throws NullPointerException if arg is null
+ * @throws NumberFormatException if cannot be parsed
*/
public static double parseElapsedTimeAsDouble(final String timeStringOrig) {
String timeString = timeStringOrig;
if (timeString==null)
- throw new NumberFormatException("GeneralHelper.parseTimeString cannot parse a null string");
+ throw new NullPointerException("GeneralHelper.parseTimeString cannot parse a null string");
try {
double d = Double.parseDouble(timeString);
return d;
@@ -522,7 +548,7 @@ public class Time {
/** As {@link #parseCalendar(String)} but returning a {@link Date},
* (i.e. a record where the time zone has been applied and forgotten). */
- public static Date parseDate(String input) {
+ public static Date parseDate(@Nullable String input) {
if (input==null) return null;
return parseCalendarMaybe(input).get().getTime();
}
@@ -536,13 +562,13 @@ public class Time {
* <p>
* Other formats including locale-specific variants, e.g. recognising month names,
* are supported but this may vary from platform to platform and may change between versions. */
- public static Calendar parseCalendar(String input) {
+ public static Calendar parseCalendar(@Nullable String input) {
if (input==null) return null;
return parseCalendarMaybe(input).get();
}
/** as {@link #parseCalendar(String)} but returning a {@link Maybe} rather than throwing or returning null */
- public static Maybe<Calendar> parseCalendarMaybe(String input) {
+ public static Maybe<Calendar> parseCalendarMaybe(@Nullable String input) {
if (input==null) return Maybe.absent("value is null");
input = input.trim();
Maybe<Calendar> result;
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/bcb96892/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
----------------------------------------------------------------------
diff --git a/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java b/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
index 60945cf..e3c8167 100644
--- a/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
+++ b/utils/common/src/test/java/org/apache/brooklyn/util/time/TimeTest.java
@@ -20,12 +20,15 @@ package org.apache.brooklyn.util.time;
import java.util.Date;
import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.brooklyn.util.time.Time;
import org.testng.Assert;
import org.testng.annotations.Test;
+import com.google.common.base.Stopwatch;
+import com.google.common.base.Ticker;
+
@Test
public class TimeTest {
@@ -141,6 +144,30 @@ public class TimeTest {
public void testMakeStringRoundedNegative() { checkR(-1, "-1ms"); }
@Test
+ public void testMakeTimeStringFromDuration() {
+ Assert.assertNull(Time.makeTimeStringExact((Duration)null));
+ Assert.assertEquals(Time.makeTimeStringExact(Duration.millis(1100)), "1s 100ms");
+
+ Assert.assertNull(Time.makeTimeStringRounded((Duration)null));
+ Assert.assertEquals(Time.makeTimeStringRounded(Duration.millis(1100)), "1.10s");
+ }
+
+ @Test
+ public void testMakeTimeStringFromStopwatch() {
+ final AtomicLong time = new AtomicLong();
+ Ticker ticker = new Ticker() {
+ @Override public long read() {
+ return time.get();
+ }
+ };
+ Assert.assertNull(Time.makeTimeStringRounded((Stopwatch)null));
+
+ Stopwatch stopwatch = Stopwatch.createStarted(ticker);
+ time.set(TimeUnit.MILLISECONDS.toNanos(1100));
+ Assert.assertEquals(Time.makeTimeStringRounded(stopwatch), "1.10s");
+ }
+
+ @Test
public void testElapsedSince() {
long aFewSecondsAgo = System.currentTimeMillis() - 7*1000;