From c8fe93cf0a99481bfe7a30bbc1cd98383205bcaa Mon Sep 17 00:00:00 2001 From: steckbrief Date: Sat, 21 Feb 2015 00:12:15 +0100 Subject: - Some comments to refer to the XEPs added - parseTimestamp method changed to use the XMLGregorianCalendar (refer to XEP-0082 and subsequently Date/DateTime definition of XML Schema Part 2, http://www.w3.org/TR/xmlschema-2/#date, http://www.w3.org/TR/xmlschema-2/#dateTime) a small test comparing the original implementation with the XMLGregorianCalendar implementation showed a significant performance improvement (about 0.1s on windows 7 64bit, AMD-A6 1.8GHz, 16GB RAM, Android Studio + Eclipse + Firefox running) --- .../siacs/conversations/parser/AbstractParser.java | 43 ++++++++++++++-------- 1 file changed, 28 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java index 08070c08..9b3e239c 100644 --- a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java +++ b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java @@ -5,6 +5,9 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; + import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Contact; import eu.siacs.conversations.services.XmppConnectionService; @@ -19,6 +22,15 @@ public abstract class AbstractParser { this.mXmppConnectionService = service; } + /** + * Gets the timestamp from the 'delay' element. + * Refer to XEP-0203: Delayed Delivery for details. @link{http://xmpp.org/extensions/xep-0203.html} + * @param packet the element to find the child element 'delay' in. + * @return the time in milli seconds of the attribute 'stamp' of the + * element 'delay'. In case there is no 'delay' element or no 'stamp' + * attribute or the current time is less than the value of the 'stamp' + * attribute the current time is returned. + */ protected long getTimestamp(Element packet) { long now = System.currentTimeMillis(); Element delay = packet.findChild("delay"); @@ -29,23 +41,24 @@ public abstract class AbstractParser { if (stamp == null) { return now; } - try { - long time = parseTimestamp(stamp).getTime(); - return now < time ? now : time; - } catch (ParseException e) { - return now; - } + long time = parseTimestamp(stamp).getTime(); + return now < time ? now : time; } - public static Date parseTimestamp(String timestamp) throws ParseException { - timestamp = timestamp.replace("Z", "+0000"); - SimpleDateFormat dateFormat; - if (timestamp.contains(".")) { - dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US); - } else { - dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US); - } - return dateFormat.parse(timestamp); + /** + * Parses the timestamp according to XEP-0082: XMPP Date and Time Profiles. + * @link{http://xmpp.org/extensions/xep-0082.html} + * + * @param timestamp the timestamp to parse + * @return Date + * @throws ParseException + */ + public static Date parseTimestamp(String timestamp) { + try { + return DatatypeFactory.newInstance().newXMLGregorianCalendar(timestamp).toGregorianCalendar().getTime(); + } catch (DatatypeConfigurationException e) { + return new Date(); + } } protected void updateLastseen(final Element packet, final Account account, -- cgit v1.2.3