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