List of usage examples for org.dom4j DocumentHelper createElement
public static Element createElement(String name)
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void deleteItems(PubSubService service, IQ iq, Element retractElement) { String nodeID = retractElement.attributeValue("node"); Node node;//from w w w .j a v a2s . c o m if (nodeID == null) { // No node was specified. Return bad_request error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } // Get the items to delete Iterator itemElements = retractElement.elementIterator("item"); if (!itemElements.hasNext()) { Element pubsubError = DocumentHelper .createElement(QName.get("item-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } if (node.isCollectionNode()) { // Cannot delete items from a collection node. Return an error. Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "persistent-items"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return; } LeafNode leafNode = (LeafNode) node; if (!leafNode.isItemRequired()) { // Cannot delete items from a leaf node that doesn't handle itemIDs. Return an error. Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "persistent-items"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return; } List<PublishedItem> items = new ArrayList<PublishedItem>(); while (itemElements.hasNext()) { Element itemElement = (Element) itemElements.next(); String itemID = itemElement.attributeValue("id"); if (itemID != null) { PublishedItem item = node.getPublishedItem(itemID); if (item == null) { // ItemID does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } else { if (item.canDelete(iq.getFrom())) { items.add(item); } else { // Publisher does not have sufficient privileges to delete this item sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } } } else { // No item ID was specified so return a bad_request error Element pubsubError = DocumentHelper .createElement(QName.get("item-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } } // Send reply with success router.route(IQ.createResultIQ(iq)); // Delete items and send subscribers a notification leafNode.deleteItems(items); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void subscribeNode(PubSubService service, IQ iq, Element childElement, Element subscribeElement) { String nodeID = subscribeElement.attributeValue("node"); Node node;/*from ww w. java 2 s . c om*/ if (nodeID == null) { if (service.isCollectionNodesSupported()) { // Entity subscribes to root collection node node = service.getRootCollectionNode(); } else { // Service does not have a root collection node so return a nodeid-required error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } // Check if sender and subscriber JIDs match or if a valid "trusted proxy" is being used JID from = iq.getFrom(); JID subscriberJID = new JID(subscribeElement.attributeValue("jid")); if (!from.toBareJID().equals(subscriberJID.toBareJID()) && !service.isServiceAdmin(from)) { // JIDs do not match and requestor is not a service admin so return an error Element pubsubError = DocumentHelper .createElement(QName.get("invalid-jid", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field. JID owner = subscriberJID.asBareJID(); // Check if the node's access model allows the subscription to proceed AccessModel accessModel = node.getAccessModel(); if (!accessModel.canSubscribe(node, owner, subscriberJID)) { sendErrorPacket(iq, accessModel.getSubsriptionError(), accessModel.getSubsriptionErrorDetail()); return; } // Check if the subscriber is an anonymous user if (!UserManager.getInstance().isRegisteredUser(subscriberJID)) { // Anonymous users cannot subscribe to the node. Return forbidden error sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } // Check if the subscription owner is a user with outcast affiliation NodeAffiliate nodeAffiliate = node.getAffiliate(owner); if (nodeAffiliate != null && nodeAffiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) { // Subscriber is an outcast. Return forbidden error sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } // Check that subscriptions to the node are enabled if (!node.isSubscriptionEnabled() && !service.isServiceAdmin(from)) { // Sender is not a sysadmin and subscription is disabled so return an error sendErrorPacket(iq, PacketError.Condition.not_allowed, null); return; } // Get any configuration form included in the options element (if any) DataForm optionsForm = null; Element options = childElement.element("options"); if (options != null) { Element formElement = options.element(QName.get("x", "jabber:x:data")); if (formElement != null) { optionsForm = new DataForm(formElement); } } // If leaf node does not support multiple subscriptions then check whether subscriber is // creating another subscription or not if (!node.isCollectionNode() && !node.isMultipleSubscriptionsEnabled()) { NodeSubscription existingSubscription = node.getSubscription(subscriberJID); if (existingSubscription != null) { // User is trying to create another subscription so // return current subscription state existingSubscription.sendSubscriptionState(iq); return; } } // Check if subscribing twice to a collection node using same subscription type if (node.isCollectionNode()) { // By default assume that new subscription is of type node boolean isNodeType = true; if (optionsForm != null) { FormField field = optionsForm.getField("pubsub#subscription_type"); if (field != null) { if ("items".equals(field.getValues().get(0))) { isNodeType = false; } } } if (nodeAffiliate != null) { for (NodeSubscription subscription : nodeAffiliate.getSubscriptions()) { if (isNodeType) { // User is requesting a subscription of type "nodes" if (NodeSubscription.Type.nodes == subscription.getType()) { // Cannot have 2 subscriptions of the same type. Return conflict error sendErrorPacket(iq, PacketError.Condition.conflict, null); return; } } else if (!node.isMultipleSubscriptionsEnabled()) { // User is requesting a subscription of type "items" and // multiple subscriptions is not allowed if (NodeSubscription.Type.items == subscription.getType()) { // User is trying to create another subscription so // return current subscription state subscription.sendSubscriptionState(iq); return; } } } } } // Create a subscription and an affiliation if the subscriber doesn't have one node.createSubscription(iq, owner, subscriberJID, accessModel.isAuthorizationRequired(), optionsForm); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void unsubscribeNode(PubSubService service, IQ iq, Element unsubscribeElement) { String nodeID = unsubscribeElement.attributeValue("node"); String subID = unsubscribeElement.attributeValue("subid"); String jidAttribute = unsubscribeElement.attributeValue("jid"); // Check if the specified JID has a subscription with the node if (jidAttribute == null) { // No JID was specified so return an error indicating that jid is required Element pubsubError = DocumentHelper .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return;//www. j a va 2 s . c om } Node node; if (nodeID == null) { if (service.isCollectionNodesSupported()) { // Entity unsubscribes from root collection node node = service.getRootCollectionNode(); } else { // Service does not have a root collection node so return a nodeid-required error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } NodeSubscription subscription; JID owner = new JID(jidAttribute); if (node.isMultipleSubscriptionsEnabled() && node.getSubscriptions(owner).size() > 1) { if (subID == null) { // No subid was specified and the node supports multiple subscriptions Element pubsubError = DocumentHelper .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Check if the specified subID belongs to an existing node subscription subscription = node.getSubscription(subID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError); return; } } } else { JID subscriberJID = new JID(jidAttribute); subscription = node.getSubscription(subscriberJID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError); return; } } JID from = iq.getFrom(); // Check that unsubscriptions to the node are enabled if (!node.isSubscriptionEnabled() && !service.isServiceAdmin(from)) { // Sender is not a sysadmin and unsubscription is disabled so return an error sendErrorPacket(iq, PacketError.Condition.not_allowed, null); return; } // A subscription was found so check if the user is allowed to cancel the subscription if (!subscription.canModify(from) && !subscription.canModify(owner)) { // Requestor is prohibited from unsubscribing entity sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } // Cancel subscription node.cancelSubscription(subscription); // Send reply with success router.route(IQ.createResultIQ(iq)); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void getSubscriptionConfiguration(PubSubService service, IQ iq, Element childElement, Element optionsElement) { String nodeID = optionsElement.attributeValue("node"); String subID = optionsElement.attributeValue("subid"); Node node;/*www . j a va2s . c o m*/ if (nodeID == null) { if (service.isCollectionNodesSupported()) { // Entity requests subscription options of root collection node node = service.getRootCollectionNode(); } else { // Service does not have a root collection node so return a nodeid-required error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } NodeSubscription subscription; if (node.isMultipleSubscriptionsEnabled()) { if (subID == null) { // No subid was specified and the node supports multiple subscriptions Element pubsubError = DocumentHelper .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Check if the specified subID belongs to an existing node subscription subscription = node.getSubscription(subID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError); return; } } } else { // Check if the specified JID has a subscription with the node String jidAttribute = optionsElement.attributeValue("jid"); if (jidAttribute == null) { // No JID was specified so return an error indicating that jid is required Element pubsubError = DocumentHelper .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } JID subscriberJID = new JID(jidAttribute); subscription = node.getSubscription(subscriberJID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError); return; } } // A subscription was found so check if the user is allowed to get the subscription options if (!subscription.canModify(iq.getFrom())) { // Requestor is prohibited from getting the subscription options sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } // Return data form containing subscription configuration to the subscriber IQ reply = IQ.createResultIQ(iq); Element replyChildElement = childElement.createCopy(); reply.setChildElement(replyChildElement); replyChildElement.element("options").add(subscription.getConfigurationForm().getElement()); router.route(reply); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void configureSubscription(PubSubService service, IQ iq, Element optionsElement) { String nodeID = optionsElement.attributeValue("node"); String subID = optionsElement.attributeValue("subid"); Node node;/* w w w . j a v a 2 s.c om*/ if (nodeID == null) { if (service.isCollectionNodesSupported()) { // Entity submits new subscription options of root collection node node = service.getRootCollectionNode(); } else { // Service does not have a root collection node so return a nodeid-required error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } NodeSubscription subscription; if (node.isMultipleSubscriptionsEnabled()) { if (subID == null) { // No subid was specified and the node supports multiple subscriptions Element pubsubError = DocumentHelper .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Check if the specified subID belongs to an existing node subscription subscription = node.getSubscription(subID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError); return; } } } else { // Check if the specified JID has a subscription with the node String jidAttribute = optionsElement.attributeValue("jid"); if (jidAttribute == null) { // No JID was specified so return an error indicating that jid is required Element pubsubError = DocumentHelper .createElement(QName.get("jid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } JID subscriberJID = new JID(jidAttribute); subscription = node.getSubscription(subscriberJID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError); return; } } // A subscription was found so check if the user is allowed to submits // new subscription options if (!subscription.canModify(iq.getFrom())) { // Requestor is prohibited from setting new subscription options sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } Element formElement = optionsElement.element(QName.get("x", "jabber:x:data")); if (formElement != null) { // Change the subscription configuration based on the completed form subscription.configure(iq, new DataForm(formElement)); } else { // No data form was included so return bad request error sendErrorPacket(iq, PacketError.Condition.bad_request, null); } }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void getPublishedItems(PubSubService service, IQ iq, Element itemsElement) { String nodeID = itemsElement.attributeValue("node"); String subID = itemsElement.attributeValue("subid"); Node node;/* w w w . j a va2 s . c o m*/ if (nodeID == null) { // User must specify a leaf node ID so return a nodeid-required error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Look for the specified node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } } if (node.isCollectionNode()) { // Node is a collection node. Return feature-not-implemented error Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "retrieve-items"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return; } // Check if sender and subscriber JIDs match or if a valid "trusted proxy" is being used JID subscriberJID = iq.getFrom(); // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field. JID owner = subscriberJID.asBareJID(); // Check if the node's access model allows the subscription to proceed AccessModel accessModel = node.getAccessModel(); if (!accessModel.canAccessItems(node, owner, subscriberJID)) { sendErrorPacket(iq, accessModel.getSubsriptionError(), accessModel.getSubsriptionErrorDetail()); return; } // Check that the requester is not an outcast NodeAffiliate affiliate = node.getAffiliate(owner); if (affiliate != null && affiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) { sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } // Get the user's subscription NodeSubscription subscription = null; if (node.isMultipleSubscriptionsEnabled() && (node.getSubscriptions(owner).size() > 1)) { if (subID == null) { // No subid was specified and the node supports multiple subscriptions and the user // has multiple subscriptions Element pubsubError = DocumentHelper .createElement(QName.get("subid-required", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.bad_request, pubsubError); return; } else { // Check if the specified subID belongs to an existing node subscription subscription = node.getSubscription(subID); if (subscription == null) { Element pubsubError = DocumentHelper .createElement(QName.get("invalid-subid", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError); return; } } } if (subscription != null && !subscription.isActive()) { Element pubsubError = DocumentHelper .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors")); sendErrorPacket(iq, PacketError.Condition.not_authorized, pubsubError); return; } LeafNode leafNode = (LeafNode) node; // Get list of items to send to the user boolean forceToIncludePayload = false; List<PublishedItem> items; String max_items = itemsElement.attributeValue("max_items"); int recentItems = 0; if (max_items != null) { try { // Parse the recent number of items requested recentItems = Integer.parseInt(max_items); } catch (NumberFormatException e) { // There was an error parsing the number so assume that all items were requested Log.warn("Assuming that all items were requested", e); max_items = null; } } if (max_items != null) { // Get the N most recent published items items = new ArrayList<PublishedItem>(leafNode.getPublishedItems(recentItems)); } else { List requestedItems = itemsElement.elements("item"); if (requestedItems.isEmpty()) { // Get all the active items that were published to the node items = new ArrayList<PublishedItem>(leafNode.getPublishedItems()); } else { items = new ArrayList<PublishedItem>(); // Indicate that payload should be included (if exists) no matter // the node configuration forceToIncludePayload = true; // Get the items as requested by the user for (Iterator it = requestedItems.iterator(); it.hasNext();) { Element element = (Element) it.next(); String itemID = element.attributeValue("id"); PublishedItem item = leafNode.getPublishedItem(itemID); if (item != null) { items.add(item); } } } } if (subscription != null && subscription.getKeyword() != null) { // Filter items that do not match the subscription keyword for (Iterator<PublishedItem> it = items.iterator(); it.hasNext();) { PublishedItem item = it.next(); if (!subscription.isKeywordMatched(item)) { // Remove item that does not match keyword it.remove(); } } } // Send items to the user leafNode.sendPublishedItems(iq, items, forceToIncludePayload); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
/** * Checks if the following conditions are satisfied and creates a node * - Requester can create nodes/* www .j av a2 s .c o m*/ * - Instant node creation is enabled * - Node does not already exist * - New node configuration is valid * * NOTE: This method should not reply to the client * * @param service * @param iq * @param childElement * @param createElement * @return */ private CreateNodeResponse createNodeHelper(PubSubService service, IQ iq, Element childElement, Element createElement) { // Get sender of the IQ packet JID from = iq.getFrom(); // Verify that sender has permissions to create nodes if (!service.canCreateNode(from) || (!UserManager.getInstance().isRegisteredUser(from) && !isComponent(from))) { // The user is not allowed to create nodes so return an error return new CreateNodeResponse(PacketError.Condition.forbidden, null, null); } DataForm completedForm = null; CollectionNode parentNode = null; String nodeID = createElement.attributeValue("node"); String newNodeID = nodeID; if (nodeID == null) { // User requested an instant node if (!service.isInstantNodeSupported()) { // Instant nodes creation is not allowed so return an error Element pubsubError = DocumentHelper .createElement(QName.get("nodeid-required", "http://jabber.org/protocol/pubsub#errors")); return new CreateNodeResponse(PacketError.Condition.not_acceptable, pubsubError, null); } do { // Create a new nodeID and make sure that the random generated string does not // match an existing node. Probability to match an existing node are very very low // but they exist :) newNodeID = StringUtils.randomString(15); } while (service.getNode(newNodeID) != null); } boolean collectionType = false; // Check if user requested to configure the node (using a data form) Element configureElement = childElement.element("configure"); if (configureElement != null) { // Get the data form that contains the parent nodeID completedForm = getSentConfigurationForm(configureElement); if (completedForm != null) { // Calculate newNodeID when new node is affiliated with a Collection FormField field = completedForm.getField("pubsub#collection"); if (field != null) { List<String> values = field.getValues(); if (!values.isEmpty()) { String parentNodeID = values.get(0); Node tempNode = service.getNode(parentNodeID); if (tempNode == null) { // Requested parent node was not found so return an error return new CreateNodeResponse(PacketError.Condition.item_not_found, null, null); } else if (!tempNode.isCollectionNode()) { // Requested parent node is not a collection node so return an error return new CreateNodeResponse(PacketError.Condition.not_acceptable, null, null); } parentNode = (CollectionNode) tempNode; } } field = completedForm.getField("pubsub#node_type"); if (field != null) { // Check if user requested to create a new collection node List<String> values = field.getValues(); if (!values.isEmpty()) { collectionType = "collection".equals(values.get(0)); } } } } // If no parent was defined then use the root collection node if (parentNode == null && service.isCollectionNodesSupported()) { parentNode = service.getRootCollectionNode(); } // Check that the requested nodeID does not exist Node existingNode = service.getNode(newNodeID); if (existingNode != null) { // There is a conflict since a node with the same ID already exists return new CreateNodeResponse(PacketError.Condition.conflict, null, null); } if (collectionType && !service.isCollectionNodesSupported()) { // Cannot create a collection node since the service doesn't support it Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "collections"); return new CreateNodeResponse(PacketError.Condition.feature_not_implemented, pubsubError, null); } if (parentNode != null && !collectionType) { // Check if requester is allowed to add a new leaf child node to the parent node if (!parentNode.isAssociationAllowed(from)) { // User is not allowed to add child leaf node to parent node. Return an error. return new CreateNodeResponse(PacketError.Condition.forbidden, null, null); } // Check if number of child leaf nodes has not been exceeded if (parentNode.isMaxLeafNodeReached()) { // Max number of child leaf nodes has been reached. Return an error. Element pubsubError = DocumentHelper .createElement(QName.get("max-nodes-exceeded", "http://jabber.org/protocol/pubsub#errors")); return new CreateNodeResponse(PacketError.Condition.conflict, pubsubError, null); } } // Create and configure the node boolean conflict = false; Node newNode = null; try { // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field. JID owner = from.asBareJID(); synchronized (newNodeID.intern()) { if (service.getNode(newNodeID) == null) { // Create the node if (collectionType) { newNode = new CollectionNode(service, parentNode, newNodeID, from); } else { newNode = new LeafNode(service, parentNode, newNodeID, from); } // Add the creator as the node owner newNode.addOwner(owner); // Configure and save the node to the backend store if (completedForm != null) { newNode.configure(completedForm); } else { newNode.saveToDB(); } CacheFactory.doClusterTask(new RefreshNodeTask(newNode)); } else { conflict = true; } } if (conflict) { // There is a conflict since a node with the same ID already exists return new CreateNodeResponse(PacketError.Condition.conflict, null, null); } else { // Return success to the node owner return new CreateNodeResponse(null, null, newNode); } } catch (NotAcceptableException e) { // Node should have at least one owner. Return not-acceptable error. return new CreateNodeResponse(PacketError.Condition.not_acceptable, null, null); } }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void getDefaultNodeConfiguration(PubSubService service, IQ iq, Element childElement, Element defaultElement) { String type = defaultElement.attributeValue("type"); type = type == null ? "leaf" : type; boolean isLeafType = "leaf".equals(type); DefaultNodeConfiguration config = service.getDefaultNodeConfiguration(isLeafType); if (config == null) { // Service does not support the requested node type so return an error Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", isLeafType ? "leaf" : "collections"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return;/*from ww w . j av a2 s . c o m*/ } // Return data form containing default node configuration IQ reply = IQ.createResultIQ(iq); Element replyChildElement = childElement.createCopy(); reply.setChildElement(replyChildElement); replyChildElement.element("default").add(config.getConfigurationForm().getElement()); router.route(reply); }
From source file:org.jivesoftware.openfire.pubsub.PubSubEngine.java
License:Open Source License
private void purgeNode(PubSubService service, IQ iq, Element purgeElement) { String nodeID = purgeElement.attributeValue("node"); if (nodeID == null) { // NodeID was not provided. Return bad-request error sendErrorPacket(iq, PacketError.Condition.bad_request, null); return;//www . ja va 2s.c o m } Node node = service.getNode(nodeID); if (node == null) { // Node does not exist. Return item-not-found error sendErrorPacket(iq, PacketError.Condition.item_not_found, null); return; } if (!node.isAdmin(iq.getFrom())) { // Requesting entity is prohibited from configuring this node. Return forbidden error sendErrorPacket(iq, PacketError.Condition.forbidden, null); return; } if (!((LeafNode) node).isPersistPublishedItems()) { // Node does not persist items. Return feature-not-implemented error Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "persistent-items"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return; } if (node.isCollectionNode()) { // Node is a collection node. Return feature-not-implemented error Element pubsubError = DocumentHelper .createElement(QName.get("unsupported", "http://jabber.org/protocol/pubsub#errors")); pubsubError.addAttribute("feature", "purge-nodes"); sendErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError); return; } // Purge the node ((LeafNode) node).purge(); // Return that node purged successfully router.route(IQ.createResultIQ(iq)); }
From source file:org.jivesoftware.openfire.pubsub.PubSubModule.java
License:Open Source License
public Iterator<Element> getIdentities(String name, String node, JID senderJID) { ArrayList<Element> identities = new ArrayList<Element>(); if (name == null && node == null) { // Answer the identity of the PubSub service Element identity = DocumentHelper.createElement("identity"); identity.addAttribute("category", "pubsub"); identity.addAttribute("name", "Publish-Subscribe service"); identity.addAttribute("type", "service"); identities.add(identity);//from w ww. j a v a 2 s.c o m } else if (name == null) { // Answer the identity of a given node Node pubNode = getNode(node); if (canDiscoverNode(pubNode)) { Element identity = DocumentHelper.createElement("identity"); identity.addAttribute("category", "pubsub"); identity.addAttribute("type", pubNode.isCollectionNode() ? "collection" : "leaf"); identities.add(identity); } } return identities.iterator(); }