diff --git a/apps/cpman/app/BUCK b/apps/cpman/app/BUCK index 936c9fffef..ea4dda7d31 100644 --- a/apps/cpman/app/BUCK +++ b/apps/cpman/app/BUCK @@ -3,7 +3,6 @@ COMPILE_DEPS = [ '//lib:JACKSON', '//lib:METRICS', '//lib:KRYO', - '//lib:joda-time', '//lib:org.apache.karaf.shell.console', '//lib:javax.ws.rs-api', '//lib:rrd4j', diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java index 9263aa84ab..8f64844afd 100644 --- a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java +++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java @@ -23,7 +23,6 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.joda.time.LocalDateTime; import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.NodeId; import org.onosproject.cpman.ControlLoadSnapshot; @@ -36,6 +35,9 @@ import org.onosproject.ui.UiMessageHandler; import org.onosproject.ui.chart.ChartModel; import org.onosproject.ui.chart.ChartRequestHandler; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -63,7 +65,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { private static final int MILLI_CONV_UNIT = 1000; - private static final String TIME_FORMAT = "HH:mm"; + private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ISO_LOCAL_TIME; private long timestamp = 0L; @@ -98,7 +100,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { DeviceId deviceId = DeviceId.deviceId(uri); if (cpms.availableResourcesSync(localNodeId, CONTROL_MESSAGE).contains(deviceId.toString())) { Map data = generateMatrix(cpms, cs, deviceId); - LocalDateTime ldt = new LocalDateTime(timestamp * MILLI_CONV_UNIT); + LocalDateTime ldt = LocalDateTime.from(Instant.ofEpochMilli(timestamp * MILLI_CONV_UNIT)); populateMetrics(cm, data, ldt, NUM_OF_DATA_POINTS); @@ -167,6 +169,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { } } + // FIXME using local time in timestamps likely to be sign of problem private void populateMetrics(ChartModel cm, Map data, LocalDateTime time, int numOfDp) { @@ -176,7 +179,7 @@ public class CpmanViewMessageHandler extends UiMessageHandler { local.put(StringUtils.lowerCase(cmt.name()), data.get(cmt)[i]); } - String calculated = time.minusMinutes(numOfDp - i).toString(TIME_FORMAT); + String calculated = time.minusMinutes(numOfDp - i).format(TIME_FORMAT); local.put(LABEL, calculated); populateMetric(cm.addDataPoint(calculated), local); diff --git a/apps/events/BUCK b/apps/events/BUCK index 52fd3a972f..12e888bfdf 100644 --- a/apps/events/BUCK +++ b/apps/events/BUCK @@ -3,7 +3,6 @@ COMPILE_DEPS = [ '//lib:JACKSON', '//lib:org.apache.karaf.shell.console', '//cli:onos-cli', - '//lib:joda-time', ] osgi_jar_with_tests ( diff --git a/apps/events/src/main/java/org/onosproject/events/EventsCommand.java b/apps/events/src/main/java/org/onosproject/events/EventsCommand.java index db8df10e22..26643447d4 100644 --- a/apps/events/src/main/java/org/onosproject/events/EventsCommand.java +++ b/apps/events/src/main/java/org/onosproject/events/EventsCommand.java @@ -24,7 +24,7 @@ import java.util.stream.Stream; import org.apache.karaf.shell.commands.Command; import org.apache.karaf.shell.commands.Option; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.cli.AbstractShellCommand; import org.onosproject.cluster.ClusterEvent; import org.onosproject.event.Event; @@ -187,7 +187,7 @@ public class EventsCommand if (event.type().toString().startsWith("PORT")) { // Port event print("%s %s\t%s/%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), deviceEvent.subject().id(), deviceEvent.port().number(), deviceEvent.port() @@ -195,7 +195,7 @@ public class EventsCommand } else { // Device event print("%s %s\t%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), deviceEvent.subject().id(), deviceEvent.subject() @@ -204,7 +204,7 @@ public class EventsCommand } else if (event instanceof MastershipEvent) { print("%s %s\t%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), event.subject(), ((MastershipEvent) event).roleInfo()); @@ -213,7 +213,7 @@ public class EventsCommand LinkEvent linkEvent = (LinkEvent) event; Link link = linkEvent.subject(); print("%s %s\t%s/%s-%s/%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), link.src().deviceId(), link.src().port(), link.dst().deviceId(), link.dst().port(), link); @@ -221,7 +221,7 @@ public class EventsCommand } else if (event instanceof HostEvent) { HostEvent hostEvent = (HostEvent) event; print("%s %s\t%s [%s->%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), hostEvent.subject().id(), hostEvent.prevSubject(), hostEvent.subject()); @@ -236,14 +236,14 @@ public class EventsCommand topo.linkCount(), topo.clusterCount()); print("%s %s%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), summary, reasons.stream().map(e -> e.type()).collect(toList())); } else if (event instanceof ClusterEvent) { print("%s %s\t%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), ((ClusterEvent) event).subject().id(), event.subject()); @@ -251,7 +251,7 @@ public class EventsCommand } else { // Unknown Event? print("%s %s\t%s [%s]", - new LocalDateTime(event.time()), + Tools.defaultOffsetDataTime(event.time()), event.type(), event.subject(), event); diff --git a/apps/evpn-route-service/api/BUCK b/apps/evpn-route-service/api/BUCK index d4825d3af1..68eeacf58f 100644 --- a/apps/evpn-route-service/api/BUCK +++ b/apps/evpn-route-service/api/BUCK @@ -1,6 +1,5 @@ COMPILE_DEPS = [ '//lib:CORE_DEPS', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/apps/evpn-route-service/api/src/main/java/org/onosproject/evpnrouteservice/EvpnRouteEvent.java b/apps/evpn-route-service/api/src/main/java/org/onosproject/evpnrouteservice/EvpnRouteEvent.java index ae3d93ab83..5e7f83a421 100644 --- a/apps/evpn-route-service/api/src/main/java/org/onosproject/evpnrouteservice/EvpnRouteEvent.java +++ b/apps/evpn-route-service/api/src/main/java/org/onosproject/evpnrouteservice/EvpnRouteEvent.java @@ -20,7 +20,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Objects; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.event.AbstractEvent; import static com.google.common.base.MoreObjects.toStringHelper; @@ -185,7 +185,7 @@ public class EvpnRouteEvent extends AbstractEvent { return super.toString(); } return toStringHelper(this) - .add("time", new LocalDateTime(time())) + .add("time", Tools.defaultOffsetDataTime(time())) .add("type", type()) .add("subject", subject()) .add("interface", devInterface) diff --git a/apps/openstacknetworking/BUCK b/apps/openstacknetworking/BUCK index 60ebc1f115..4a5d19c873 100644 --- a/apps/openstacknetworking/BUCK +++ b/apps/openstacknetworking/BUCK @@ -9,7 +9,6 @@ COMPILE_DEPS = [ '//cli:onos-cli', '//apps/openstacknode/api:onos-apps-openstacknode-api', '//lib:openstack4j-core', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java index c4aad233c0..4f4892fdd6 100644 --- a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java +++ b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java @@ -15,7 +15,7 @@ */ package org.onosproject.openstacknetworking.api; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.event.AbstractEvent; import org.openstack4j.model.network.Network; import org.openstack4j.model.network.Port; @@ -178,7 +178,7 @@ public class OpenstackNetworkEvent extends AbstractEvent { @Override public String toString() { return toStringHelper(this) - .add("time", new LocalDateTime(time())) + .add("time", Tools.defaultOffsetDataTime(time())) .add("type", type()) .add("subject", subject()) .add("prevSubject", prevSubject) diff --git a/apps/segmentrouting/BUCK b/apps/segmentrouting/BUCK index ae72b22fd9..5942871bc8 100644 --- a/apps/segmentrouting/BUCK +++ b/apps/segmentrouting/BUCK @@ -9,7 +9,6 @@ COMPILE_DEPS = [ '//incubator/api:onos-incubator-api', '//utils/rest:onlab-rest', '//apps/route-service/api:onos-apps-route-service-api', - '//lib:joda-time', ] BUNDLES = [ diff --git a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java index 709d05eb06..5014811ad9 100644 --- a/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java +++ b/apps/segmentrouting/src/main/java/org/onosproject/segmentrouting/DefaultRoutingHandler.java @@ -23,7 +23,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import org.joda.time.DateTime; import org.onlab.packet.Ip4Address; import org.onlab.packet.Ip6Address; import org.onlab.packet.IpPrefix; @@ -41,6 +40,7 @@ import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -79,7 +79,7 @@ public class DefaultRoutingHandler { private volatile Status populationStatus; private ScheduledExecutorService executorService = newScheduledThreadPool(1, groupedThreads("retryftr", "retry-%d", log)); - private DateTime lastRoutingChange; + private Instant lastRoutingChange; /** * Represents the default routing population status. @@ -150,8 +150,8 @@ public class DefaultRoutingHandler { * @return true if stable */ public boolean isRoutingStable() { - long last = (long) (lastRoutingChange.getMillis() / 1000.0); - long now = (long) (DateTime.now().getMillis() / 1000.0); + long last = (long) (lastRoutingChange.toEpochMilli() / 1000.0); + long now = (long) (Instant.now().toEpochMilli() / 1000.0); log.trace("Routing stable since {}s", now - last); return (now - last) > STABLITY_THRESHOLD; } @@ -173,7 +173,7 @@ public class DefaultRoutingHandler { * startup or after a configuration event. */ public void populateAllRoutingRules() { - lastRoutingChange = DateTime.now(); + lastRoutingChange = Instant.now(); statusLock.lock(); try { if (populationStatus == Status.STARTED) { @@ -249,7 +249,7 @@ public class DefaultRoutingHandler { return; } - lastRoutingChange = DateTime.now(); + lastRoutingChange = Instant.now(); statusLock.lock(); try { if (populationStatus == Status.STARTED) { @@ -374,7 +374,7 @@ public class DefaultRoutingHandler { log.warn("Only one event can be handled for link status change .. aborting"); return; } - lastRoutingChange = DateTime.now(); + lastRoutingChange = Instant.now(); executorService.schedule(new UpdateMaps(), UPDATE_INTERVAL, TimeUnit.SECONDS); statusLock.lock(); diff --git a/cli/BUCK b/cli/BUCK index 5e2d397e04..3fedcf4770 100644 --- a/cli/BUCK +++ b/cli/BUCK @@ -7,7 +7,6 @@ COMPILE_DEPS = [ '//incubator/net:onos-incubator-net', '//utils/rest:onlab-rest', '//core/common:onos-core-common', - '//lib:joda-time', ] osgi_jar ( diff --git a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java index 32a4ba0092..d1ecafa3f0 100644 --- a/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java +++ b/cli/src/main/java/org/onosproject/cli/MetricsListCommand.java @@ -31,8 +31,8 @@ import com.google.common.collect.Ordering; import com.google.common.collect.TreeMultimap; import org.apache.karaf.shell.commands.Argument; import org.apache.karaf.shell.commands.Command; -import org.joda.time.LocalDateTime; import org.onlab.metrics.MetricsService; +import org.onlab.util.Tools; import java.util.Comparator; import java.util.Map; @@ -108,7 +108,7 @@ public class MetricsListCommand extends AbstractShellCommand { Gauge gauge = (Gauge) metric; final Object value = gauge.getValue(); if (name.endsWith("EpochMs") && value instanceof Long) { - print(" value = %s (%s)", value, new LocalDateTime(value)); + print(" value = %s (%s)", value, Tools.defaultOffsetDataTime((Long) value)); } else { print(" value = %s", value); } @@ -233,4 +233,6 @@ public class MetricsListCommand extends AbstractShellCommand { private double nanoToMs(double nano) { return nano / 1_000_000D; } + + } diff --git a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java index a0967b3ab3..8246b1d45a 100644 --- a/cli/src/main/java/org/onosproject/cli/NodesListCommand.java +++ b/cli/src/main/java/org/onosproject/cli/NodesListCommand.java @@ -20,13 +20,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import org.apache.karaf.shell.commands.Command; -import org.joda.time.DateTime; import org.onlab.util.Tools; import org.onosproject.cluster.ClusterAdminService; import org.onosproject.cluster.ControllerNode; import org.onosproject.core.Version; import org.onosproject.utils.Comparators; +import java.time.Instant; import java.util.Collections; import java.util.List; @@ -51,10 +51,10 @@ public class NodesListCommand extends AbstractShellCommand { } else { ControllerNode self = service.getLocalNode(); for (ControllerNode node : nodes) { - DateTime lastUpdated = service.getLastUpdated(node.id()); + Instant lastUpdated = service.getLastUpdatedInstant(node.id()); String timeAgo = "Never"; if (lastUpdated != null) { - timeAgo = Tools.timeAgo(lastUpdated.getMillis()); + timeAgo = Tools.timeAgo(lastUpdated.getEpochSecond()); } Version version = service.getVersion(node.id()); print(FMT, node.id(), node.ip(), node.tcpPort(), diff --git a/core/api/pom.xml b/core/api/pom.xml index f4d65cad90..290c3454f0 100644 --- a/core/api/pom.xml +++ b/core/api/pom.xml @@ -34,6 +34,7 @@ joda-time joda-time + 2.9.3 commons-configuration diff --git a/core/api/src/main/java/org/onosproject/cluster/ClusterService.java b/core/api/src/main/java/org/onosproject/cluster/ClusterService.java index e4cf7ecc24..1a75e5fccb 100644 --- a/core/api/src/main/java/org/onosproject/cluster/ClusterService.java +++ b/core/api/src/main/java/org/onosproject/cluster/ClusterService.java @@ -15,6 +15,8 @@ */ package org.onosproject.cluster; +import java.time.Instant; +import java.util.Optional; import java.util.Set; import org.joda.time.DateTime; @@ -72,6 +74,27 @@ public interface ClusterService extends ListenerService * @param nodeId controller node identifier * @return system time when the availability state was last updated. */ - DateTime getLastUpdated(NodeId nodeId); + default Instant getLastUpdatedInstant(NodeId nodeId) { + return Optional.ofNullable(getLastUpdated(nodeId)) + .map(DateTime::getMillis) + .map(Instant::ofEpochMilli) + .orElse(null); + } + + /** + * Returns the system when the availability state was last updated. + * + * @param nodeId controller node identifier + * @return system time when the availability state was last updated. + * + * @deprecated in 1.12.0 + */ + @Deprecated + default DateTime getLastUpdated(NodeId nodeId) { + return Optional.ofNullable(getLastUpdatedInstant(nodeId)) + .map(Instant::toEpochMilli) + .map(DateTime::new) + .orElse(null); + } /** * Adds a new controller node to the cluster. diff --git a/core/api/src/main/java/org/onosproject/event/AbstractEvent.java b/core/api/src/main/java/org/onosproject/event/AbstractEvent.java index 2d810a3262..754ecbbf08 100644 --- a/core/api/src/main/java/org/onosproject/event/AbstractEvent.java +++ b/core/api/src/main/java/org/onosproject/event/AbstractEvent.java @@ -15,7 +15,7 @@ */ package org.onosproject.event; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import static com.google.common.base.MoreObjects.toStringHelper; @@ -70,7 +70,7 @@ public class AbstractEvent implements Event { @Override public String toString() { return toStringHelper(this) - .add("time", new LocalDateTime(time)) + .add("time", Tools.defaultOffsetDataTime(time)) .add("type", type()) .add("subject", subject()) .toString(); diff --git a/core/api/src/main/java/org/onosproject/mastership/MastershipEvent.java b/core/api/src/main/java/org/onosproject/mastership/MastershipEvent.java index 4242e61f9e..db5ba74d21 100644 --- a/core/api/src/main/java/org/onosproject/mastership/MastershipEvent.java +++ b/core/api/src/main/java/org/onosproject/mastership/MastershipEvent.java @@ -15,7 +15,7 @@ */ package org.onosproject.mastership; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.cluster.RoleInfo; import org.onosproject.event.AbstractEvent; import org.onosproject.net.DeviceId; @@ -114,7 +114,7 @@ public class MastershipEvent extends AbstractEvent { return super.toString(); } return toStringHelper(this) - .add("time", new LocalDateTime(time())) + .add("time", Tools.defaultOffsetDataTime(time())) .add("type", type()) .add("subject", subject()) .add("port", port) diff --git a/core/api/src/main/java/org/onosproject/net/host/HostEvent.java b/core/api/src/main/java/org/onosproject/net/host/HostEvent.java index 318c3ff966..0ed491fab3 100644 --- a/core/api/src/main/java/org/onosproject/net/host/HostEvent.java +++ b/core/api/src/main/java/org/onosproject/net/host/HostEvent.java @@ -15,7 +15,7 @@ */ package org.onosproject.net.host; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.event.AbstractEvent; import org.onosproject.net.Host; @@ -104,7 +104,7 @@ public class HostEvent extends AbstractEvent { @Override public String toString() { return toStringHelper(this) - .add("time", new LocalDateTime(time())) + .add("time", Tools.defaultOffsetDataTime(time())) .add("type", type()) .add("subject", subject()) .add("prevSubject", prevSubject()) diff --git a/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java b/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java index 1e7d9ba4d2..9d26208167 100644 --- a/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java +++ b/core/api/src/main/java/org/onosproject/net/intf/InterfaceEvent.java @@ -16,7 +16,7 @@ package org.onosproject.net.intf; -import org.joda.time.LocalDateTime; +import org.onlab.util.Tools; import org.onosproject.event.AbstractEvent; import static com.google.common.base.MoreObjects.toStringHelper; @@ -106,7 +106,7 @@ public class InterfaceEvent extends AbstractEvent { return MoreObjects.toStringHelper(this) .add("value", value instanceof byte[] ? new ByteArraySizeHashPrinter((byte[]) value) : value) .add("version", version) - .add("creationTime", new DateTime(creationTime)) + .add("creationTime", Tools.defaultOffsetDataTime(creationTime)) .toString(); } } diff --git a/core/api/src/main/java/org/onosproject/store/service/WallClockTimestamp.java b/core/api/src/main/java/org/onosproject/store/service/WallClockTimestamp.java index 307de2e2e1..78f6b197d5 100644 --- a/core/api/src/main/java/org/onosproject/store/service/WallClockTimestamp.java +++ b/core/api/src/main/java/org/onosproject/store/service/WallClockTimestamp.java @@ -19,7 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import java.util.Objects; -import org.joda.time.DateTime; +import org.onlab.util.Tools; import org.onosproject.store.Timestamp; import com.google.common.collect.ComparisonChain; @@ -69,7 +69,7 @@ public class WallClockTimestamp implements Timestamp { @Override public String toString() { - return new DateTime(unixTimestamp).toString(); + return Tools.defaultOffsetDataTime(unixTimestamp).toString(); } /** diff --git a/core/api/src/main/java/org/onosproject/ui/table/cell/TimeFormatter.java b/core/api/src/main/java/org/onosproject/ui/table/cell/TimeFormatter.java index f2dba0366d..adf8ead92a 100644 --- a/core/api/src/main/java/org/onosproject/ui/table/cell/TimeFormatter.java +++ b/core/api/src/main/java/org/onosproject/ui/table/cell/TimeFormatter.java @@ -16,13 +16,21 @@ package org.onosproject.ui.table.cell; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.format.DateTimeFormat; -import org.joda.time.format.DateTimeFormatter; +import static java.time.temporal.ChronoField.CLOCK_HOUR_OF_AMPM; +import static java.time.temporal.ChronoField.MINUTE_OF_HOUR; +import static java.time.temporal.ChronoField.SECOND_OF_MINUTE; + +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; +import java.time.temporal.TemporalAccessor; import java.util.Locale; +import org.joda.time.DateTimeZone; + /** * Formats time values using {@link DateTimeFormatter}. */ @@ -38,7 +46,19 @@ public final class TimeFormatter extends AbstractCellFormatter { * Constructs a time formatter that uses the default locale and timezone. */ public TimeFormatter() { - dtf = DateTimeFormat.longTime(); + dtf = new DateTimeFormatterBuilder() + .appendValue(CLOCK_HOUR_OF_AMPM) + .appendLiteral(':') + .appendValue(MINUTE_OF_HOUR, 2) + .optionalStart() + .appendLiteral(':') + .appendValue(SECOND_OF_MINUTE, 2) + .appendLiteral(' ') + .appendText(ChronoField.AMPM_OF_DAY) + .optionalStart() + .appendLiteral(' ') + .appendOffset("+HH:MM", "+00:00") + .toFormatter(); } /** @@ -58,14 +78,33 @@ public final class TimeFormatter extends AbstractCellFormatter { * @param zone time zone to use * @return self, for chaining */ - public TimeFormatter withZone(DateTimeZone zone) { + public TimeFormatter withZone(ZoneId zone) { dtf = dtf.withZone(zone); return this; } + /** + * Sets the time zone to use for formatting the time. + * + * @param zone time zone to use + * @return self, for chaining + * + * @deprecated in 1.12.0 + */ + @Deprecated + public TimeFormatter withZone(DateTimeZone zone) { + return withZone(zone.toTimeZone().toZoneId()); + } + @Override protected String nonNullFormat(Object value) { - return dtf.print((DateTime) value); + if (value instanceof TemporalAccessor) { + return dtf.format((TemporalAccessor) value); + } else if (value instanceof org.joda.time.DateTime) { + return dtf.format(Instant.ofEpochMilli(((org.joda.time.DateTime) value).getMillis())); + } + // should never reach here + return String.valueOf(value); } } diff --git a/core/api/src/test/java/org/onosproject/cluster/ClusterServiceAdapter.java b/core/api/src/test/java/org/onosproject/cluster/ClusterServiceAdapter.java index cc6916f960..bc40f67443 100644 --- a/core/api/src/test/java/org/onosproject/cluster/ClusterServiceAdapter.java +++ b/core/api/src/test/java/org/onosproject/cluster/ClusterServiceAdapter.java @@ -15,9 +15,9 @@ */ package org.onosproject.cluster; +import java.time.Instant; import java.util.Set; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import com.google.common.collect.ImmutableSet; @@ -56,7 +56,7 @@ public class ClusterServiceAdapter implements ClusterService { } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { return null; } diff --git a/core/api/src/test/java/org/onosproject/ui/table/cell/TimeFormatterTest.java b/core/api/src/test/java/org/onosproject/ui/table/cell/TimeFormatterTest.java index 4f73490a04..7517aac0e3 100644 --- a/core/api/src/test/java/org/onosproject/ui/table/cell/TimeFormatterTest.java +++ b/core/api/src/test/java/org/onosproject/ui/table/cell/TimeFormatterTest.java @@ -16,14 +16,15 @@ package org.onosproject.ui.table.cell; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.junit.Test; import org.onosproject.ui.table.CellFormatter; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.Locale; -import static org.junit.Assert.assertTrue; +import static org.hamcrest.Matchers.isOneOf; +import static org.junit.Assert.assertThat; /** * Unit tests for {@link TimeFormatter}. @@ -31,9 +32,9 @@ import static org.junit.Assert.assertTrue; public class TimeFormatterTest { private static final Locale LOCALE = Locale.ENGLISH; - private static final DateTimeZone ZONE = DateTimeZone.UTC; + private static final ZoneOffset ZONE = ZoneOffset.UTC; - private static final DateTime TIME = new DateTime(2015, 5, 4, 15, 30, ZONE); + private static final OffsetDateTime TIME = OffsetDateTime.of(2015, 5, 4, 15, 30, 0, 0, ZONE); private static final String EXP_ZONE_NAME = "3:30:00 PM UTC"; private static final String EXP_ZONE_OFFSET = "3:30:00 PM +00:00"; @@ -45,7 +46,6 @@ public class TimeFormatterTest { @Test public void basic() { - assertTrue("wrong format", (EXP_ZONE_NAME.equals(fmt.format(TIME)) || - EXP_ZONE_OFFSET.equals(fmt.format(TIME)))); + assertThat(fmt.format(TIME), isOneOf(EXP_ZONE_OFFSET, EXP_ZONE_NAME)); } } diff --git a/core/common/BUCK b/core/common/BUCK index 46d519d6bc..56c6970e5e 100644 --- a/core/common/BUCK +++ b/core/common/BUCK @@ -4,7 +4,6 @@ SRC_DEPS = [ '//lib:METRICS', '//incubator/api:onos-incubator-api', '//core/api:onos-api', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java index fb501234e8..4a4fdafc81 100644 --- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java +++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleClusterStore.java @@ -23,7 +23,6 @@ import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import org.onosproject.cluster.ClusterEvent; import org.onosproject.cluster.ClusterStore; @@ -41,6 +40,7 @@ import org.onosproject.net.intent.WorkPartitionService; import org.onosproject.store.AbstractStore; import org.slf4j.Logger; +import java.time.Instant; import java.util.Set; import java.util.function.Function; @@ -64,7 +64,7 @@ public class SimpleClusterStore private ControllerNode instance; - private final DateTime creationTime = DateTime.now(); + private final Instant creationTime = Instant.now(); @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) protected EventDeliveryService eventDispatcher; @@ -123,7 +123,7 @@ public class SimpleClusterStore } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { return creationTime; } diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java index e533f23ced..31480e896f 100644 --- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java +++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleMastershipStore.java @@ -19,6 +19,7 @@ import static org.onosproject.mastership.MastershipEvent.Type.BACKUPS_CHANGED; import static org.onosproject.mastership.MastershipEvent.Type.MASTER_CHANGED; import static org.slf4j.LoggerFactory.getLogger; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -36,7 +37,6 @@ import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import org.onosproject.cluster.ClusterEventListener; import org.onosproject.cluster.ClusterService; @@ -97,7 +97,7 @@ public class SimpleMastershipStore clusterService = new ClusterService() { - private final DateTime creationTime = DateTime.now(); + private final Instant creationTime = Instant.now(); @Override public ControllerNode getLocalNode() { @@ -135,7 +135,7 @@ public class SimpleMastershipStore } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { return creationTime; } diff --git a/core/net/BUCK b/core/net/BUCK index 26b898da0b..267c70a955 100644 --- a/core/net/BUCK +++ b/core/net/BUCK @@ -9,7 +9,6 @@ COMPILE_DEPS = [ '//incubator/net:onos-incubator-net', '//incubator/store:onos-incubator-store', '//core/store/serializers:onos-core-serializers', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java index fc3d802065..92a3894465 100644 --- a/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java +++ b/core/net/src/main/java/org/onosproject/cluster/impl/ClusterManager.java @@ -15,6 +15,7 @@ */ package org.onosproject.cluster.impl; +import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -31,7 +32,6 @@ import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; import org.apache.karaf.system.SystemService; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import org.onlab.util.Tools; import org.onosproject.cluster.ClusterAdminService; @@ -147,9 +147,9 @@ public class ClusterManager } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { checkPermission(CLUSTER_READ); - return store.getLastUpdated(nodeId); + return store.getLastUpdatedInstant(nodeId); } @Override diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java index bbf6d394a3..eb477be3dd 100644 --- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java +++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java @@ -25,7 +25,6 @@ import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; -import org.joda.time.DateTime; import org.onlab.util.KryoNamespace; import org.onlab.util.Tools; import org.onosproject.cluster.ClusterService; @@ -74,6 +73,7 @@ import org.onosproject.store.serializers.KryoNamespaces; import org.onosproject.store.service.Serializer; import org.slf4j.Logger; +import java.time.Instant; import java.util.Collection; import java.util.HashSet; import java.util.List; @@ -180,9 +180,9 @@ public class DeviceManager */ private class LocalStatus { boolean connected; - DateTime dateTime; + Instant dateTime; - public LocalStatus(boolean b, DateTime now) { + public LocalStatus(boolean b, Instant now) { connected = b; dateTime = now; } @@ -333,7 +333,7 @@ public class DeviceManager if (ls == null) { return "No Record"; } - String timeAgo = Tools.timeAgo(ls.dateTime.getMillis()); + String timeAgo = Tools.timeAgo(ls.dateTime.toEpochMilli()); return (ls.connected) ? "connected " + timeAgo : "disconnected " + timeAgo; } @@ -508,7 +508,7 @@ public class DeviceManager checkNotNull(deviceDescription, DEVICE_DESCRIPTION_NULL); checkValidity(); - deviceLocalStatus.put(deviceId, new LocalStatus(true, DateTime.now())); + deviceLocalStatus.put(deviceId, new LocalStatus(true, Instant.now())); BasicDeviceConfig cfg = networkConfigService.getConfig(deviceId, BasicDeviceConfig.class); if (!isAllowed(cfg)) { @@ -564,7 +564,7 @@ public class DeviceManager public void deviceDisconnected(DeviceId deviceId) { checkNotNull(deviceId, DEVICE_ID_NULL); checkValidity(); - deviceLocalStatus.put(deviceId, new LocalStatus(false, DateTime.now())); + deviceLocalStatus.put(deviceId, new LocalStatus(false, Instant.now())); log.info("Device {} disconnected from this node", deviceId); List descs = store.getPortDescriptions(provider().id(), deviceId) diff --git a/core/store/dist/BUCK b/core/store/dist/BUCK index 3483f64d2b..b6be5ece89 100644 --- a/core/store/dist/BUCK +++ b/core/store/dist/BUCK @@ -14,7 +14,6 @@ COMPILE_DEPS = [ '//lib:netty-resolver', '//lib:commons-math3', '//incubator/api:onos-incubator-api', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java index 34b2f0bd7b..b1067634c7 100644 --- a/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java +++ b/core/store/dist/src/main/java/org/onosproject/store/cluster/impl/DistributedClusterStore.java @@ -27,7 +27,6 @@ import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferencePolicy; import org.apache.felix.scr.annotations.Service; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import org.onlab.util.KryoNamespace; import org.onosproject.cfg.ConfigProperty; @@ -50,6 +49,7 @@ import org.onosproject.store.service.Serializer; import org.osgi.service.component.ComponentContext; import org.slf4j.Logger; +import java.time.Instant; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -106,7 +106,7 @@ public class DistributedClusterStore private final Map allNodes = Maps.newConcurrentMap(); private final Map nodeStates = Maps.newConcurrentMap(); private final Map nodeVersions = Maps.newConcurrentMap(); - private final Map nodeLastUpdatedTimes = Maps.newConcurrentMap(); + private final Map nodeLastUpdatedTimes = Maps.newConcurrentMap(); private ScheduledExecutorService heartBeatSender = Executors.newSingleThreadScheduledExecutor( groupedThreads("onos/cluster/membership", "heartbeat-sender", log)); @@ -273,7 +273,7 @@ public class DistributedClusterStore if (newVersion != null) { nodeVersions.put(nodeId, newVersion); } - nodeLastUpdatedTimes.put(nodeId, DateTime.now()); + nodeLastUpdatedTimes.put(nodeId, Instant.now()); notifyChange(nodeId, currentState, newState, currentVersion, newVersion); } } @@ -357,7 +357,7 @@ public class DistributedClusterStore } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { return nodeLastUpdatedTimes.get(nodeId); } diff --git a/incubator/store/BUCK b/incubator/store/BUCK index 84c5d47ced..e3fa120839 100644 --- a/incubator/store/BUCK +++ b/incubator/store/BUCK @@ -5,7 +5,6 @@ COMPILE_DEPS = [ '//incubator/api:onos-incubator-api', '//core/store/dist:onos-core-dist', '//core/store/serializers:onos-core-serializers', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java index df52547302..730ebeef82 100644 --- a/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java +++ b/incubator/store/src/main/java/org/onosproject/incubator/store/virtual/impl/SimpleVirtualMastershipStore.java @@ -24,7 +24,6 @@ import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.Service; -import org.joda.time.DateTime; import org.onlab.packet.IpAddress; import org.onosproject.cluster.ClusterEventListener; import org.onosproject.cluster.ClusterService; @@ -43,6 +42,7 @@ import org.onosproject.net.DeviceId; import org.onosproject.net.MastershipRole; import org.slf4j.Logger; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -454,7 +454,7 @@ public class SimpleVirtualMastershipStore ClusterService faceClusterService = new ClusterService() { - private final DateTime creationTime = DateTime.now(); + private final Instant creationTime = Instant.now(); @Override public ControllerNode getLocalNode() { @@ -492,7 +492,7 @@ public class SimpleVirtualMastershipStore } @Override - public DateTime getLastUpdated(NodeId nodeId) { + public Instant getLastUpdatedInstant(NodeId nodeId) { return creationTime; } diff --git a/lib/pom.xml b/lib/pom.xml index 5e5f11e055..4a9d96eb6c 100644 --- a/lib/pom.xml +++ b/lib/pom.xml @@ -420,12 +420,6 @@ ${netty4.version} - - joda-time - joda-time - 2.9.3 - - com.google.code.findbugs jsr305 @@ -472,11 +466,6 @@ - - joda-time - joda-time - - commons-configuration commons-configuration diff --git a/providers/netconf/alarm/BUCK b/providers/netconf/alarm/BUCK index 292fe14b90..761f2ed4e8 100644 --- a/providers/netconf/alarm/BUCK +++ b/providers/netconf/alarm/BUCK @@ -3,7 +3,6 @@ COMPILE_DEPS = [ '//incubator/api:onos-incubator-api', '//protocols/netconf/api:onos-protocols-netconf-api', '//protocols/netconf/ctl:onos-protocols-netconf-ctl', - '//lib:joda-time', ] osgi_jar_with_tests ( diff --git a/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmTranslator.java b/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmTranslator.java index b39a772fc4..46367043fb 100644 --- a/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmTranslator.java +++ b/providers/netconf/alarm/src/main/java/org/onosproject/provider/netconf/alarm/NetconfAlarmTranslator.java @@ -38,10 +38,11 @@ import javax.xml.transform.stream.StreamResult; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; +import java.time.Instant; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collection; -import org.joda.time.format.ISODateTimeFormat; import org.xml.sax.SAXException; import static org.slf4j.LoggerFactory.getLogger; @@ -96,7 +97,7 @@ public class NetconfAlarmTranslator implements AlarmTranslator { private long parseDate(String timeStr) throws UnsupportedOperationException, IllegalArgumentException { - return ISODateTimeFormat.dateTime().parseMillis(timeStr); + return DateTimeFormatter.ISO_DATE_TIME.parse(timeStr, Instant::from).getEpochSecond(); } private static String nodeToString(Node rootNode) throws TransformerException { diff --git a/utils/misc/src/main/java/org/onlab/util/Tools.java b/utils/misc/src/main/java/org/onlab/util/Tools.java index a678f6a201..057441e302 100644 --- a/utils/misc/src/main/java/org/onlab/util/Tools.java +++ b/utils/misc/src/main/java/org/onlab/util/Tools.java @@ -32,6 +32,9 @@ import java.nio.file.Paths; import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; +import java.time.Instant; +import java.time.OffsetDateTime; +import java.time.ZoneId; import java.util.Arrays; import java.util.Collection; import java.util.Dictionary; @@ -676,7 +679,7 @@ public abstract class Tools { return future; } - BlockingAwareFuture newFuture = new BlockingAwareFuture(); + BlockingAwareFuture newFuture = new BlockingAwareFuture<>(); future.whenComplete((result, error) -> { Runnable completer = () -> { if (future.isCompletedExceptionally()) { @@ -827,4 +830,16 @@ public abstract class Tools { } } + /** + * Creates OffsetDateTime instance from epoch milliseconds, + * using system default time zone. + * + * @param epochMillis to convert + * @return OffsetDateTime + */ + public static OffsetDateTime defaultOffsetDataTime(long epochMillis) { + return OffsetDateTime.ofInstant(Instant.ofEpochMilli(epochMillis), + ZoneId.systemDefault()); + } + } diff --git a/web/gui/BUCK b/web/gui/BUCK index 2354dfec3f..b295c7f3ba 100644 --- a/web/gui/BUCK +++ b/web/gui/BUCK @@ -17,7 +17,6 @@ COMPILE_DEPS = [ '//utils/rest:onlab-rest', '//core/store/serializers:onos-core-serializers', ':onos-tools-gui', - '//lib:joda-time', ] TEST_DEPS = [ diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java index c9ec72c837..980d7f6939 100644 --- a/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java +++ b/web/gui/src/main/java/org/onosproject/ui/impl/ClusterViewMessageHandler.java @@ -19,7 +19,6 @@ package org.onosproject.ui.impl; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableSet; -import org.joda.time.DateTime; import org.onosproject.cluster.ClusterService; import org.onosproject.cluster.ControllerNode; import org.onosproject.cluster.NodeId; @@ -32,6 +31,7 @@ import org.onosproject.ui.table.TableModel; import org.onosproject.ui.table.TableRequestHandler; import org.onosproject.ui.table.cell.TimeFormatter; +import java.time.Instant; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -120,7 +120,7 @@ public class ClusterViewMessageHandler extends UiMessageHandler { private void populateRow(TableModel.Row row, ControllerNode node, ClusterService cs) { NodeId id = node.id(); - DateTime lastUpdated = cs.getLastUpdated(id); + Instant lastUpdated = cs.getLastUpdatedInstant(id); ControllerNode.State state = cs.getState(id); String iconId = state.isActive() ? ICON_ID_ONLINE : ICON_ID_OFFLINE; String startedId = state.isReady() ? ICON_ID_ONLINE : ICON_ID_OFFLINE;