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.smack.packet; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.*; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Default implementation of the PacketExtension interface. Unless a PacketExtensionProvider 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * is registered with {@link org.jivesoftware.smack.provider.ProviderManager ProviderManager}, 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * instances of this class will be returned when getting packet extensions.<p> 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * This class provides a very simple representation of an XML sub-document. Each element 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * is a key in a Map with its CDATA being the value. For example, given the following 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * XML sub-document: 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <pre> 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <foo xmlns="http://bar.com"> 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <color>blue</color> 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <food>pizza</food> 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * </foo></pre> 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * In this case, getValue("color") would return "blue", and getValue("food") would 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * return "pizza". This parsing mechanism mechanism is very simplistic and will not work 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * as desired in all cases (for example, if some of the elements have attributes. In those 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * cases, a custom PacketExtensionProvider should be used. 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Matt Tucker 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class DefaultPacketExtension implements PacketExtension { 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String elementName; 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String namespace; 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Map<String,String> map; 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new generic packet extension. 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param elementName the name of the element of the XML sub-document. 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param namespace the namespace of the element. 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public DefaultPacketExtension(String elementName, String namespace) { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.elementName = elementName; 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.namespace = namespace; 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the XML element name of the extension sub-packet root element. 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the XML element name of the packet extension. 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getElementName() { 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return elementName; 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the XML namespace of the extension sub-packet root element. 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the XML namespace of the packet extension. 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getNamespace() { 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return namespace; 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String toXML() { 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen StringBuilder buf = new StringBuilder(); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<").append(elementName).append(" xmlns=\"").append(namespace).append("\">"); 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen for (String name : getNames()) { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String value = getValue(name); 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("<").append(name).append(">"); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append(value); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</").append(name).append(">"); 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen buf.append("</").append(elementName).append(">"); 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return buf.toString(); 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns an unmodifiable collection of the names that can be used to get 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * values of the packet extension. 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the names. 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public synchronized Collection<String> getNames() { 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (map == null) { 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.emptySet(); 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableSet(new HashMap<String,String>(map).keySet()); 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns a packet extension value given a name. 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param name the name. 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the value. 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public synchronized String getValue(String name) { 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (map == null) { 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return null; 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return map.get(name); 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Sets a packet extension value using the given name. 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param name the name. 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param value the value. 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public synchronized void setValue(String name, String value) { 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (map == null) { 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen map = new HashMap<String,String>(); 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen map.put(name, value); 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}