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