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