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