/* * Copyright 2009 Mike Cumings * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.kenai.jbosh; import java.util.Collections; import java.util.Map; import java.util.Set; /** * Class representing a single message to or from the BOSH connection * manager (CM). * <p/> * These messages consist of a single {@code body} element * (qualified within the BOSH namespace: * {@code http://jabber.org/protocol/httpbind}) and contain zero or more * child elements (of any namespace). These child elements constitute the * message payload. * <p/> * In addition to the message payload, the attributes of the wrapper * {@code body} element may also need to be used as part of the communication * protocol being implemented on top of BOSH, or to define additional * namespaces used by the child "payload" elements. These attributes are * exposed via accessors. */ public abstract class AbstractBody { /////////////////////////////////////////////////////////////////////////// // Constructor: /** * Restrict subclasses to the local package. */ AbstractBody() { // Empty } /////////////////////////////////////////////////////////////////////////// // Public methods: /** * Get a set of all defined attribute names. * * @return set of qualified attribute names */ public final Set<BodyQName> getAttributeNames() { Map<BodyQName, String> attrs = getAttributes(); return Collections.unmodifiableSet(attrs.keySet()); } /** * Get the value of the specified attribute. * * @param attr name of the attribute to retriece * @return attribute value, or {@code null} if not defined */ public final String getAttribute(final BodyQName attr) { Map<BodyQName, String> attrs = getAttributes(); return attrs.get(attr); } /////////////////////////////////////////////////////////////////////////// // Abstract methods: /** * Get a map of all defined attribute names with their corresponding values. * * @return map of qualified attributes */ public abstract Map<BodyQName, String> getAttributes(); /** * Get an XML String representation of this message. * * @return XML string representing the body message */ public abstract String toXML(); /////////////////////////////////////////////////////////////////////////// // Package-private methods: /** * Returns the qualified name of the root/wrapper element. * * @return qualified name */ static BodyQName getBodyQName() { return BodyQName.createBOSH("body"); } }