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 Chenimport java.util.List;
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * This class is used to for multiple purposes.
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>It can represent an event containing a list of items that have been published
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>It can represent an event containing a list of retracted (deleted) items.
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>It can represent a request to delete a list of items.
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <li>It can represent a request to get existing items.
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <p><b>Please note, this class is used for internal purposes, and is not required for usage of
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * pubsub functionality.</b>
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Robin Collier
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class ItemsExtension extends NodeExtension implements EmbeddedPacketExtension
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen{
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected ItemsElementType type;
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected Boolean notify;
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	protected List<? extends PacketExtension> items;
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public enum ItemsElementType
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		/** An items element, which has an optional <b>max_items</b> attribute when requesting items */
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		items(PubSubElementType.ITEMS, "max_items"),
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		/** A retract element, which has an optional <b>notify</b> attribute when publishing deletions */
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		retract(PubSubElementType.RETRACT, "notify");
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		private PubSubElementType elem;
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		private String att;
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		private ItemsElementType(PubSubElementType nodeElement, String attribute)
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		{
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			elem = nodeElement;
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			att = attribute;
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		public PubSubElementType getNodeElement()
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		{
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return elem;
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		public String getElementAttribute()
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		{
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return att;
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Construct an instance with a list representing items that have been published or deleted.
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <p>Valid scenarios are:
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * optional value for the <b>max_items</b> attribute.
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * only id's and an optional value for the <b>notify</b> attribute.
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * attributeValue = <code>null</code>
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Items deleted event -  itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * attributeValue = <code>null</code>
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param itemsType Type of representation
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param nodeId The node to which the items are being sent or deleted
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param items The list of {@link Item} or {@link RetractItem}
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param attributeValue The value of the <b>max_items</b>
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public ItemsExtension(ItemsElementType itemsType, String nodeId, List<? extends PacketExtension> items)
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		super(itemsType.getNodeElement(), nodeId);
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		type = itemsType;
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.items = items;
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Construct an instance with a list representing items that have been published or deleted.
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <p>Valid scenarios are:
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * optional value for the <b>max_items</b> attribute.
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * only id's and an optional value for the <b>notify</b> attribute.
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * attributeValue = <code>null</code>
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * <li>Items deleted event -  itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * attributeValue = <code>null</code>
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param itemsType Type of representation
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param nodeId The node to which the items are being sent or deleted
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param items The list of {@link Item} or {@link RetractItem}
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @param attributeValue The value of the <b>max_items</b>
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public ItemsExtension(String nodeId, List<? extends PacketExtension> items, boolean notify)
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		super(ItemsElementType.retract.getNodeElement(), nodeId);
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		type = ItemsElementType.retract;
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.items = items;
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		this.notify = notify;
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Get the type of element
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return The element type
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public ItemsElementType getItemsElementType()
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return type;
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public List<PacketExtension> getExtensions()
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return (List<PacketExtension>)getItems();
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Gets the items related to the type of request or event.
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * return List of {@link Item}, {@link RetractItem}, or null
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public List<? extends PacketExtension> getItems()
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return items;
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	/**
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * Gets the value of the optional attribute related to the {@link ItemsElementType}.
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 *
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 * @return The attribute value
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	 */
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public boolean getNotify()
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return notify;
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	@Override
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public String toXML()
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if ((items == null) || (items.size() == 0))
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		{
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return super.toXML();
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		else
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		{
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			StringBuilder builder = new StringBuilder("<");
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append(getElementName());
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append(" node='");
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append(getNode());
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			if (notify != null)
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			{
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append("' ");
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append(type.getElementAttribute());
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append("='");
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append(notify.equals(Boolean.TRUE) ? 1 : 0);
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append("'>");
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			}
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			else
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			{
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				builder.append("'>");
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				for (PacketExtension item : items)
178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				{
179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen					builder.append(item.toXML());
180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen				}
181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			}
182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append("</");
184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append(getElementName());
185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			builder.append(">");
186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			return builder.toString();
187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		}
188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	@Override
191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	public String toString()
192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	{
193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		return getClass().getName() + "Content [" + toXML() + "]";
194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
197