Home | History | Annotate | Download | only in packet
      1 /**
      2  * $RCSfile$
      3  * $Revision$
      4  * $Date$
      5  *
      6  * Copyright 2003-2007 Jive Software.
      7  *
      8  * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
      9  * you may not use this file except in compliance with the License.
     10  * You may obtain a copy of the License at
     11  *
     12  *     http://www.apache.org/licenses/LICENSE-2.0
     13  *
     14  * Unless required by applicable law or agreed to in writing, software
     15  * distributed under the License is distributed on an "AS IS" BASIS,
     16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     17  * See the License for the specific language governing permissions and
     18  * limitations under the License.
     19  */
     20 
     21 package org.jivesoftware.smackx.packet;
     22 
     23 import java.text.DateFormat;
     24 import java.text.SimpleDateFormat;
     25 import java.util.Date;
     26 import java.util.TimeZone;
     27 
     28 import org.jivesoftware.smack.packet.PacketExtension;
     29 
     30 /**
     31  * Represents timestamp information about data stored for later delivery. A DelayInformation will
     32  * always includes the timestamp when the packet was originally sent and may include more
     33  * information such as the JID of the entity that originally sent the packet as well as the reason
     34  * for the delay.<p>
     35  *
     36  * For more information see <a href="http://xmpp.org/extensions/xep-0091.html">XEP-0091</a>
     37  * and <a href="http://xmpp.org/extensions/xep-0203.html">XEP-0203</a>.
     38  *
     39  * @author Gaston Dombiak
     40  */
     41 public class DelayInformation implements PacketExtension {
     42 
     43     /**
     44      * Date format according to the obsolete XEP-0091 specification.
     45      * XEP-0091 recommends to use this old format for date-time instead of
     46      * the one specified in XEP-0082.
     47      * <p>
     48      * Date formats are not synchronized. Since multiple threads access the format concurrently,
     49      * it must be synchronized externally.
     50      */
     51     public static final DateFormat XEP_0091_UTC_FORMAT = new SimpleDateFormat(
     52             "yyyyMMdd'T'HH:mm:ss");
     53     static {
     54         XEP_0091_UTC_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
     55     }
     56 
     57     private Date stamp;
     58     private String from;
     59     private String reason;
     60 
     61     /**
     62      * Creates a new instance with the specified timestamp.
     63      * @param stamp the timestamp
     64      */
     65     public DelayInformation(Date stamp) {
     66         super();
     67         this.stamp = stamp;
     68     }
     69 
     70     /**
     71      * Returns the JID of the entity that originally sent the packet or that delayed the
     72      * delivery of the packet or <tt>null</tt> if this information is not available.
     73      *
     74      * @return the JID of the entity that originally sent the packet or that delayed the
     75      *         delivery of the packet.
     76      */
     77     public String getFrom() {
     78         return from;
     79     }
     80 
     81     /**
     82      * Sets the JID of the entity that originally sent the packet or that delayed the
     83      * delivery of the packet or <tt>null</tt> if this information is not available.
     84      *
     85      * @param from the JID of the entity that originally sent the packet.
     86      */
     87     public void setFrom(String from) {
     88         this.from = from;
     89     }
     90 
     91     /**
     92      * Returns the timestamp when the packet was originally sent. The returned Date is
     93      * be understood as UTC.
     94      *
     95      * @return the timestamp when the packet was originally sent.
     96      */
     97     public Date getStamp() {
     98         return stamp;
     99     }
    100 
    101     /**
    102      * Returns a natural-language description of the reason for the delay or <tt>null</tt> if
    103      * this information is not available.
    104      *
    105      * @return a natural-language description of the reason for the delay or <tt>null</tt>.
    106      */
    107     public String getReason() {
    108         return reason;
    109     }
    110 
    111     /**
    112      * Sets a natural-language description of the reason for the delay or <tt>null</tt> if
    113      * this information is not available.
    114      *
    115      * @param reason a natural-language description of the reason for the delay or <tt>null</tt>.
    116      */
    117     public void setReason(String reason) {
    118         this.reason = reason;
    119     }
    120 
    121     public String getElementName() {
    122         return "x";
    123     }
    124 
    125     public String getNamespace() {
    126         return "jabber:x:delay";
    127     }
    128 
    129     public String toXML() {
    130         StringBuilder buf = new StringBuilder();
    131         buf.append("<").append(getElementName()).append(" xmlns=\"").append(getNamespace()).append(
    132                 "\"");
    133         buf.append(" stamp=\"");
    134         synchronized (XEP_0091_UTC_FORMAT) {
    135             buf.append(XEP_0091_UTC_FORMAT.format(stamp));
    136         }
    137         buf.append("\"");
    138         if (from != null && from.length() > 0) {
    139             buf.append(" from=\"").append(from).append("\"");
    140         }
    141         buf.append(">");
    142         if (reason != null && reason.length() > 0) {
    143             buf.append(reason);
    144         }
    145         buf.append("</").append(getElementName()).append(">");
    146         return buf.toString();
    147     }
    148 
    149 }
    150