diff options
author | steckbrief <steckbrief@chefmail.de> | 2015-02-21 00:12:15 +0100 |
---|---|---|
committer | steckbrief <steckbrief@chefmail.de> | 2015-02-21 00:12:15 +0100 |
commit | c8fe93cf0a99481bfe7a30bbc1cd98383205bcaa (patch) | |
tree | 4f4e1809aa31ad94c6601450e4d105e19863399f | |
parent | 20eae3955700341188bc1907a506970f5817a153 (diff) |
- 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)
-rw-r--r-- | src/main/java/eu/siacs/conversations/parser/AbstractParser.java | 43 |
1 files changed, 28 insertions, 15 deletions
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, |