From: Maros Marsalek Date: Fri, 23 Oct 2015 22:25:40 +0000 (+0200) Subject: BUG-4521 Support milliseconds in event-time notification format X-Git-Tag: release/lithium-sr3~5 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=c9bde204249db7acd55294c2066e1fd3ef833a31;p=controller.git BUG-4521 Support milliseconds in event-time notification format Current format does not support milliseconds right now and netconf notification RFC clearly says the milliseconds should be supported Change-Id: Ib91b5f08a0ec78721e2b0984b8dc123f3283d2e1 Signed-off-by: Maros Marsalek --- diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java index d580043b20..e0b9ad6881 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/schema/mapping/NetconfMessageTransformer.java @@ -145,7 +145,19 @@ public class NetconfMessageTransformer implements MessageTransformer EVENT_TIME_FORMAT = new ThreadLocal() { protected SimpleDateFormat initialValue() { - return new SimpleDateFormat(NetconfNotification.RFC3339_DATE_FORMAT_BLUEPRINT); + final SimpleDateFormat withMillis = new SimpleDateFormat( + NetconfNotification.RFC3339_DATE_FORMAT_WITH_MILLIS_BLUEPRINT); + + return new SimpleDateFormat(NetconfNotification.RFC3339_DATE_FORMAT_BLUEPRINT) { + @Override public Date parse(final String source) throws ParseException { + try { + return super.parse(source); + } catch (ParseException e) { + // In case of failure, try to parse with milliseconds + return withMillis.parse(source); + } + } + }; } public void set(SimpleDateFormat value) { @@ -178,7 +190,8 @@ public class NetconfMessageTransformer implements MessageTransformer(NetconfNotification.UNKNOWN_EVENT_TIME, notificationElement); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfToNotificationTest.java b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfToNotificationTest.java index 96c478f097..dc09cff1d8 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfToNotificationTest.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/test/java/org/opendaylight/controller/sal/connect/netconf/NetconfToNotificationTest.java @@ -69,7 +69,7 @@ public class NetconfToNotificationTest { assertNotNull(root); assertEquals(6, Iterables.size(root.getValue())); assertEquals("user-visited-page", root.getNodeType().getLocalName()); - assertEquals(new SimpleDateFormat(NetconfNotification.RFC3339_DATE_FORMAT_BLUEPRINT).parse("2007-07-08T00:01:00Z"), + assertEquals(new SimpleDateFormat(NetconfNotification.RFC3339_DATE_FORMAT_WITH_MILLIS_BLUEPRINT).parse("2015-10-23T09:42:27.67175+00:00"), ((DOMEvent) domNotification).getEventTime()); } } diff --git a/opendaylight/md-sal/sal-netconf-connector/src/test/resources/notification-payload.xml b/opendaylight/md-sal/sal-netconf-connector/src/test/resources/notification-payload.xml index 431787d34c..e7d551378a 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/test/resources/notification-payload.xml +++ b/opendaylight/md-sal/sal-netconf-connector/src/test/resources/notification-payload.xml @@ -1,5 +1,5 @@ -2007-07-08T00:01:00Z +2015-10-23T09:42:27.67175+00:00 ui:public-user 172.23.29.104 diff --git a/opendaylight/netconf/netconf-notifications-api/src/main/java/org/opendaylight/controller/netconf/notifications/NetconfNotification.java b/opendaylight/netconf/netconf-notifications-api/src/main/java/org/opendaylight/controller/netconf/notifications/NetconfNotification.java index efa42c03e9..d9a9e1d685 100644 --- a/opendaylight/netconf/netconf-notifications-api/src/main/java/org/opendaylight/controller/netconf/notifications/NetconfNotification.java +++ b/opendaylight/netconf/netconf-notifications-api/src/main/java/org/opendaylight/controller/netconf/notifications/NetconfNotification.java @@ -23,8 +23,17 @@ public final class NetconfNotification extends NetconfMessage { public static final String NOTIFICATION = "notification"; public static final String NOTIFICATION_NAMESPACE = "urn:ietf:params:netconf:capability:notification:1.0"; public static final String RFC3339_DATE_FORMAT_BLUEPRINT = "yyyy-MM-dd'T'HH:mm:ssXXX"; + // The format with milliseconds is a bit fragile, it cannot be used for timestamps without millis (thats why its a separate format) + // + it might not work properly with more than 6 digits + // TODO try to find a better solution with Java8 + public static final String RFC3339_DATE_FORMAT_WITH_MILLIS_BLUEPRINT = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX"; public static final String EVENT_TIME = "eventTime"; + /** + * Used for unknown/un-parse-able event-times + */ + public static final Date UNKNOWN_EVENT_TIME = new Date(0); + /** * Create new notification and capture the timestamp in the constructor */ diff --git a/opendaylight/netconf/netconf-notifications-impl/src/test/java/org/opendaylight/controller/netconf/notifications/impl/NetconfNotificationManagerTest.java b/opendaylight/netconf/netconf-notifications-impl/src/test/java/org/opendaylight/controller/netconf/notifications/impl/NetconfNotificationManagerTest.java index 36d2015ab7..34a9cbfa2b 100644 --- a/opendaylight/netconf/netconf-notifications-impl/src/test/java/org/opendaylight/controller/netconf/notifications/impl/NetconfNotificationManagerTest.java +++ b/opendaylight/netconf/netconf-notifications-impl/src/test/java/org/opendaylight/controller/netconf/notifications/impl/NetconfNotificationManagerTest.java @@ -15,6 +15,9 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import com.google.common.collect.Lists; +import java.text.ParseException; +import java.text.SimpleDateFormat; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; @@ -40,6 +43,25 @@ public class NetconfNotificationManagerTest { MockitoAnnotations.initMocks(this); } + @Test public void testEventTime() throws Exception { + final SimpleDateFormat simpleDateFormat = new SimpleDateFormat( + NetconfNotification.RFC3339_DATE_FORMAT_BLUEPRINT); + final SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat( + NetconfNotification.RFC3339_DATE_FORMAT_WITH_MILLIS_BLUEPRINT); + + for (String time : Lists.newArrayList("2001-07-04T12:08:56.235-07:00", "2015-10-23T09:42:27.67175+00:00", + "1970-01-01T17:17:22.229568+00:00", "1937-01-01T12:00:27.87+00:20", "1990-12-31T15:59:60-08:00", + "1990-12-31T23:59:60Z", "1996-12-19T16:39:57-08:00" + // ,"1985-04-12T23:20:50.52Z" + )) { + try { + simpleDateFormat.parse(time); + } catch (ParseException e) { + simpleDateFormat2.parse(time); + } + } + } + @Test public void testNotificationListeners() throws Exception { final NetconfNotificationManager netconfNotificationManager = new NetconfNotificationManager();