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