/** | |
* All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package org.jivesoftware.smackx.pubsub; | |
import java.util.List; | |
import org.jivesoftware.smack.packet.PacketExtension; | |
/** | |
* This class is used to for multiple purposes. | |
* <li>It can represent an event containing a list of items that have been published | |
* <li>It can represent an event containing a list of retracted (deleted) items. | |
* <li>It can represent a request to delete a list of items. | |
* <li>It can represent a request to get existing items. | |
* | |
* <p><b>Please note, this class is used for internal purposes, and is not required for usage of | |
* pubsub functionality.</b> | |
* | |
* @author Robin Collier | |
*/ | |
public class ItemsExtension extends NodeExtension implements EmbeddedPacketExtension | |
{ | |
protected ItemsElementType type; | |
protected Boolean notify; | |
protected List<? extends PacketExtension> items; | |
public enum ItemsElementType | |
{ | |
/** An items element, which has an optional <b>max_items</b> attribute when requesting items */ | |
items(PubSubElementType.ITEMS, "max_items"), | |
/** A retract element, which has an optional <b>notify</b> attribute when publishing deletions */ | |
retract(PubSubElementType.RETRACT, "notify"); | |
private PubSubElementType elem; | |
private String att; | |
private ItemsElementType(PubSubElementType nodeElement, String attribute) | |
{ | |
elem = nodeElement; | |
att = attribute; | |
} | |
public PubSubElementType getNodeElement() | |
{ | |
return elem; | |
} | |
public String getElementAttribute() | |
{ | |
return att; | |
} | |
} | |
/** | |
* Construct an instance with a list representing items that have been published or deleted. | |
* | |
* <p>Valid scenarios are: | |
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an | |
* optional value for the <b>max_items</b> attribute. | |
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing | |
* only id's and an optional value for the <b>notify</b> attribute. | |
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and | |
* attributeValue = <code>null</code> | |
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and | |
* attributeValue = <code>null</code> | |
* | |
* @param itemsType Type of representation | |
* @param nodeId The node to which the items are being sent or deleted | |
* @param items The list of {@link Item} or {@link RetractItem} | |
* @param attributeValue The value of the <b>max_items</b> | |
*/ | |
public ItemsExtension(ItemsElementType itemsType, String nodeId, List<? extends PacketExtension> items) | |
{ | |
super(itemsType.getNodeElement(), nodeId); | |
type = itemsType; | |
this.items = items; | |
} | |
/** | |
* Construct an instance with a list representing items that have been published or deleted. | |
* | |
* <p>Valid scenarios are: | |
* <li>Request items from node - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and an | |
* optional value for the <b>max_items</b> attribute. | |
* <li>Request to delete items - itemsType = {@link ItemsElementType#retract}, items = list of {@link Item} containing | |
* only id's and an optional value for the <b>notify</b> attribute. | |
* <li>Items published event - itemsType = {@link ItemsElementType#items}, items = list of {@link Item} and | |
* attributeValue = <code>null</code> | |
* <li>Items deleted event - itemsType = {@link ItemsElementType#items}, items = list of {@link RetractItem} and | |
* attributeValue = <code>null</code> | |
* | |
* @param itemsType Type of representation | |
* @param nodeId The node to which the items are being sent or deleted | |
* @param items The list of {@link Item} or {@link RetractItem} | |
* @param attributeValue The value of the <b>max_items</b> | |
*/ | |
public ItemsExtension(String nodeId, List<? extends PacketExtension> items, boolean notify) | |
{ | |
super(ItemsElementType.retract.getNodeElement(), nodeId); | |
type = ItemsElementType.retract; | |
this.items = items; | |
this.notify = notify; | |
} | |
/** | |
* Get the type of element | |
* | |
* @return The element type | |
*/ | |
public ItemsElementType getItemsElementType() | |
{ | |
return type; | |
} | |
public List<PacketExtension> getExtensions() | |
{ | |
return (List<PacketExtension>)getItems(); | |
} | |
/** | |
* Gets the items related to the type of request or event. | |
* | |
* return List of {@link Item}, {@link RetractItem}, or null | |
*/ | |
public List<? extends PacketExtension> getItems() | |
{ | |
return items; | |
} | |
/** | |
* Gets the value of the optional attribute related to the {@link ItemsElementType}. | |
* | |
* @return The attribute value | |
*/ | |
public boolean getNotify() | |
{ | |
return notify; | |
} | |
@Override | |
public String toXML() | |
{ | |
if ((items == null) || (items.size() == 0)) | |
{ | |
return super.toXML(); | |
} | |
else | |
{ | |
StringBuilder builder = new StringBuilder("<"); | |
builder.append(getElementName()); | |
builder.append(" node='"); | |
builder.append(getNode()); | |
if (notify != null) | |
{ | |
builder.append("' "); | |
builder.append(type.getElementAttribute()); | |
builder.append("='"); | |
builder.append(notify.equals(Boolean.TRUE) ? 1 : 0); | |
builder.append("'>"); | |
} | |
else | |
{ | |
builder.append("'>"); | |
for (PacketExtension item : items) | |
{ | |
builder.append(item.toXML()); | |
} | |
} | |
builder.append("</"); | |
builder.append(getElementName()); | |
builder.append(">"); | |
return builder.toString(); | |
} | |
} | |
@Override | |
public String toString() | |
{ | |
return getClass().getName() + "Content [" + toXML() + "]"; | |
} | |
} |