f5dd65269bde34884d34241286f8e111fd379e58
[ccsdk/features.git] /
1 /*******************************************************************************
2  * ============LICENSE_START========================================================================
3  * ONAP : ccsdk feature sdnr wt
4  * =================================================================================================
5  * Copyright (C) 2019 highstreet technologies GmbH Intellectual Property. All rights reserved.
6  * =================================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
8  * in compliance with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software distributed under the License
13  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
14  * or implied. See the License for the specific language governing permissions and limitations under
15  * the License.
16  * ============LICENSE_END==========================================================================
17  ******************************************************************************/
18 package org.onap.ccsdk.features.sdnr.wt.dataprovider.model.types;
19
20 import java.time.LocalDateTime;
21 import java.time.OffsetDateTime;
22 import java.time.ZoneOffset;
23 import java.time.ZonedDateTime;
24 import java.time.format.DateTimeFormatter;
25 import java.time.format.DateTimeParseException;
26 import java.util.Date;
27 import org.onap.ccsdk.features.sdnr.wt.dataprovider.model.NetconfTimeStamp;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 /**
33  * 2019/06/17 Redesign to ZonedDateTime because of sync problems.
34  *
35  * Function is handling the NETCONF and the format used by database and restconf communication.
36  *
37  * Input supported for the formats used in NETCONF messages:
38  *
39  * Format1 ISO 8601 2017-01-18T11:44:49.482-05:00
40  *
41  * Format2 NETCONF - pattern from ietf-yang-types "2013-07-15" Pattern:
42  * "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-](\d{2}):(\d{2}))"
43  *
44  * Format3 NETCONF DateAndTime CoreModel-CoreFoundationModule-TypeDefinitions vom
45  * 2016-07-01 Example1: 20170118114449.1Z Example2: 20170118114449.1-0500 Pattern:
46  * "\d{4}\d{2}\d{2}\d{2}\d{2}\d{2}.\d+?(Z|[\+\-](\d{2})(\d{2}))" typedef DateAndTime { description
47  * "This primitive type defines the date and time according to the following structure:
48  * 'yyyyMMddhhmmss.s[Z|{+|-}HHMm]' where: yyyy '0000'..'9999' year MM '01'..'12' month dd '01'..'31'
49  * day hh '00'..'23' hour mm '00'..'59' minute ss '00'..'59' second s '.0'..'.9' tenth of second
50  * (set to '.0' if EMS or NE cannot support this granularity) Z 'Z' indicates UTC (rather than local
51  * time) {+|-} '+' or '-' delta from UTC HH '00'..'23' time zone difference in hours Mm '00'..'59'
52  * time zone difference in minutes."; type string; } Format4 E/// specific Example1:
53  * 2017-01-23T13:32:38-05:00 Example2: 2017-01-23T13:32-05:00
54  *
55  * Input formats netconfTime as String according the formats given above
56  *
57  * Return format is String in ISO8601 Format for database and presentation.
58  *
59  * Example formats:
60  *    1) ISO8601. Example 2017-01-18T11:44:49.482-05:00
61  *    2) Microwave ONF. Examples 20170118114449.1Z, 20170118114449.1-0500
62  *    3.1) Ericson. Example: 2017-01-23T13:32:38-05:00
63  *    3.2) Ericson. Example: 2017-01-23T13:32-05:00
64  *          Always 10 Groups,
65  *          1:Year 2:Month 3:day 4:Hour 5:minute 6:optional sec 7:optional ms 8:optional Z or 9:offset
66  *           signedhour 10:min
67  *
68  * Template:
69  *     private static final NetconfTimeStamp NETCONFTIME_CONVERTER = NetconfTimeStamp.getConverter();
70  */
71
72 public class NetconfTimeStampImpl implements NetconfTimeStamp {
73     private static final Logger LOG = LoggerFactory.getLogger(NetconfTimeStamp.class);
74
75     private static final NetconfTimeStamp CONVERTER = new NetconfTimeStampImpl();
76
77     /**
78      * Specify the input format expected from netconf, and from specific devices.
79      */
80     private static DateTimeFormatter formatterInput = DateTimeFormatter.ofPattern(""
81             + "[yyyy-MM-dd'T'HH:mm[:ss][.SSS][.SS][.S][xxx][xx][X][Z]]"
82             + "[yyyyMMddHHmmss[.SSS][.SS][.S][xxx][xx][X][Z]]"
83             ).withZone(ZoneOffset.UTC);
84
85     /**
86      * Specify output format that is used internally
87      */
88     private static DateTimeFormatter formatterOutput = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.S'Z'")
89             .withZone(ZoneOffset.UTC);
90
91     /**
92      * Use static access
93      */
94     private NetconfTimeStampImpl() {
95     }
96
97     /*
98      * ------------------------------------ Public function
99      */
100
101     /**
102      * Use this function to get the converter
103      * @return global converter
104      */
105     public static NetconfTimeStamp getConverter() {
106         return CONVERTER;
107     }
108
109     /**
110      * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format
111      *
112      * @return String with Date in NETCONF/YANG Format Version 1.0.
113      */
114     @Override
115     public String getTimeStampAsNetconfString() {
116         return ZonedDateTime.now(ZoneOffset.UTC).format(formatterOutput);
117     }
118
119     /**
120      * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format
121
122      * @return String with Date in NETCONF/YANG Format Version 1.0.
123      */
124     @Override
125     public String getTimeStampAsNetconfString(Date date) {
126         return ZonedDateTime.ofInstant(date.toInstant(),ZoneOffset.UTC).format(formatterOutput);
127     }
128
129
130
131     /**
132      * Get actual timestamp as NETCONF specific type NETCONF/YANG 1.0 Format in GMT
133      *
134      * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0.
135      */
136     @Override
137     public DateAndTime getTimeStamp() {
138         return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString());
139     }
140
141     /**
142      * Get time from date as NETCONF specific type NETCONF/YANG 1.0 Format in GMT
143      * @param date specifying the date and time
144      * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0.
145      */
146     @Override
147     public DateAndTime getTimeStamp(Date date) {
148         return DateAndTime.getDefaultInstance(getTimeStampAsNetconfString(date));
149     }
150     /**
151      * Get time from date as NETCONF specific type NETCONF/YANG 1.0 Format in GMT
152      * @param date specifying the date and time
153      * @return DateAndTime Type 1.0. Date in NETCONF/YANG Format Version 1.0.
154      */
155     @Override
156     public DateAndTime getTimeStamp(String date) {
157         return DateAndTime.getDefaultInstance(date);
158     }
159
160     /**
161      * Return the String with a NETCONF time converted to long
162      *
163      * @param netconfTime as String according the formats given above
164      * @return Epoch milliseconds
165      * @throws IllegalArgumentException In case of no compliant time format definition for the string
166      */
167     @Override
168     public long getTimeStampFromNetconfAsMilliseconds(String netconfTime) throws IllegalArgumentException {
169         try {
170             long utcMillis = doParse(netconfTime).toInstant().toEpochMilli();
171             return utcMillis;
172         } catch (DateTimeParseException e) {
173             throw new IllegalArgumentException(
174                     "No pattern for NETCONF data string: " + netconfTime + " Msg:" + e.getMessage());
175         }
176        }
177
178     /**
179      * Deliver String result.
180      *
181      * @param netconfTime as String according the formats given above
182      * @return If successful: String in ISO8601 Format for database and presentation. If "wrong formed
183      *         input" the Input string with the prefix "Maleformed date" is delivered back.
184      */
185     @Override
186     public String getTimeStampFromNetconf(String netconfTime) {
187         try {
188             String inputUTC = doParse(netconfTime).format(formatterOutput);
189             return inputUTC;
190         } catch (Exception e) {
191             LOG.info(e.getMessage());
192          }
193         LOG.debug("No pattern for NETCONF data string: {}", netconfTime);
194         return "Malformed date: " + netconfTime; // Error handling
195     }
196
197     /*----------------------------------------------------
198      * Private functions
199      */
200
201     private OffsetDateTime doParse(String netconfTime) {
202         return OffsetDateTime.parse(netconfTime, formatterInput);
203     }
204
205     @Override
206     public Date getDateFromNetconf(String netconfTime) {
207         return Date.from(LocalDateTime.parse(netconfTime, formatterInput).atZone(ZoneOffset.UTC).toInstant());
208     }
209
210     @Override
211     public String getTimeStampAsNetconfString(LocalDateTime dt) {
212         return formatterOutput.format(dt);
213     }
214
215 }