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