1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License.
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *     http://www.apache.org/licenses/LICENSE-2.0
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS,
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License.
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.pubsub;
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Represents a subscription to node for both requests and replies.
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Robin Collier
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Subscription extends NodeExtension
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected String jid;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected String id;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected State state;
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected boolean configRequired = false;
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public enum State
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		subscribed, unconfigured, pending, none
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Used to constructs a subscription request to the root node with the specified
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * JID.
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param subscriptionJid The subscriber JID
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public Subscription(String subscriptionJid)
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this(subscriptionJid, null, null, null);
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Used to constructs a subscription request to the specified node with the specified
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * JID.
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param subscriptionJid The subscriber JID
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param nodeId The node id
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public Subscription(String subscriptionJid, String nodeId)
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this(subscriptionJid, nodeId, null, null);
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Constructs a representation of a subscription reply to the specified node
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * and JID.  The server	will have supplied the subscription id and current state.
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param jid The JID the request was made under
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param nodeId The node subscribed to
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param subscriptionId The id of this subscription
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param state The current state of the subscription
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public Subscription(String jid, String nodeId, String subscriptionId, State state)
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		super(PubSubElementType.SUBSCRIPTION, nodeId);
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.jid = jid;
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		id = subscriptionId;
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.state = state;
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Constructs a representation of a subscription reply to the specified node
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * and JID.  The server	will have supplied the subscription id and current state
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * and whether the subscription need to be configured.
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param jid The JID the request was made under
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param nodeId The node subscribed to
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param subscriptionId The id of this subscription
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param state The current state of the subscription
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param configRequired Is configuration required to complete the subscription
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public Subscription(String jid, String nodeId, String subscriptionId, State state, boolean configRequired)
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		super(PubSubElementType.SUBSCRIPTION, nodeId);
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.jid = jid;
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		id = subscriptionId;
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.state = state;
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.configRequired = configRequired;
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Gets the JID the subscription is created for
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return The JID
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public String getJid()
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return jid;
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Gets the subscription id
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return The subscription id
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public String getId()
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return id;
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Gets the current subscription state.
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return Current subscription state
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public State getState()
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return state;
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * This value is only relevant when the {@link #getState()} is {@link State#unconfigured}
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return true if configuration is required, false otherwise
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public boolean isConfigRequired()
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return configRequired;
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public String toXML()
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		StringBuilder builder = new StringBuilder("<subscription");
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		appendAttribute(builder, "jid", jid);
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (getNode() != null)
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			appendAttribute(builder, "node", getNode());
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (id != null)
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			appendAttribute(builder, "subid", id);
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (state != null)
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			appendAttribute(builder, "subscription", state.toString());
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append("/>");
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return builder.toString();
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	private void appendAttribute(StringBuilder builder, String att, String value)
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append(" ");
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append(att);
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append("='");
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append(value);
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		builder.append("'");
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
161