1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/* 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2009 Mike Cumings 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage com.kenai.jbosh; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Collections; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Map; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Set; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Class representing a single message to or from the BOSH connection 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * manager (CM). 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p/> 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * These messages consist of a single {@code body} element 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * (qualified within the BOSH namespace: 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@code http://jabber.org/protocol/httpbind}) and contain zero or more 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * child elements (of any namespace). These child elements constitute the 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * message payload. 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p/> 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * In addition to the message payload, the attributes of the wrapper 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * {@code body} element may also need to be used as part of the communication 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * protocol being implemented on top of BOSH, or to define additional 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * namespaces used by the child "payload" elements. These attributes are 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * exposed via accessors. 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic abstract class AbstractBody { 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Constructor: 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Restrict subclasses to the local package. 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen AbstractBody() { 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Empty 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Public methods: 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get a set of all defined attribute names. 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return set of qualified attribute names 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public final Set<BodyQName> getAttributeNames() { 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Map<BodyQName, String> attrs = getAttributes(); 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return Collections.unmodifiableSet(attrs.keySet()); 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get the value of the specified attribute. 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param attr name of the attribute to retriece 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return attribute value, or {@code null} if not defined 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public final String getAttribute(final BodyQName attr) { 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Map<BodyQName, String> attrs = getAttributes(); 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return attrs.get(attr); 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Abstract methods: 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get a map of all defined attribute names with their corresponding values. 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return map of qualified attributes 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public abstract Map<BodyQName, String> getAttributes(); 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Get an XML String representation of this message. 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return XML string representing the body message 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public abstract String toXML(); 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /////////////////////////////////////////////////////////////////////////// 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Package-private methods: 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the qualified name of the root/wrapper element. 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return qualified name 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen static BodyQName getBodyQName() { 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return BodyQName.createBOSH("body"); 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 105