Example usage for org.dom4j Element attributeValue

List of usage examples for org.dom4j Element attributeValue

Introduction

In this page you can find the example usage for org.dom4j Element attributeValue.

Prototype

String attributeValue(QName qName);

Source Link

Document

This returns the attribute value for the attribute with the given fully qualified name or null if there is no such attribute or the empty string if the attribute value is empty.

Usage

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ subscribeNode(PubSubService service, IQ iq, Element childElement, Element subscribeElement) {
    String nodeID = subscribeElement.attributeValue("node");
    Node node;//from   www . ja  va  2  s .  co  m
    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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
        }
    }
    // 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"));
        return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
    }
    // TODO Assumed that the owner of the subscription is the bare JID of the subscription JID. Waiting StPeter answer for explicit field.
    JID owner = new JID(subscriberJID.getNode(), subscriberJID.getDomain(), null, true);
    // Check if the node's access model allows the subscription to proceed
    AccessModel accessModel = node.getAccessModel();
    if (!accessModel.canSubscribe(node, owner, subscriberJID)) {
        return createErrorPacket(iq, accessModel.getSubsriptionError(),
                accessModel.getSubsriptionErrorDetail());
    }
    //   TODO:  Not supporting anonymous...
    // 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
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }
    // 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
        return createErrorPacket(iq, PacketError.Condition.not_allowed, null);
    }

    // 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 createSuccessPacket(iq);
        }
    }

    // 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
                        return createErrorPacket(iq, PacketError.Condition.conflict, null);
                    }
                } 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 createSuccessPacket(iq);
                    }
                }
            }
        }
    }

    // Create a subscription and an affiliation if the subscriber doesn't have one
    return node.createSubscription(iq, owner, subscriberJID, accessModel.isAuthorizationRequired(),
            optionsForm);
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ 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"));
        return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
    }//from  ww  w. j  a  v a2 s  . com
    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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
        }
    }
    NodeSubscription subscription = null;
    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"));
            createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        } 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"));
                return createErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
            }
        }
    } 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"));
            return createErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
        }
    }
    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
        return createErrorPacket(iq, PacketError.Condition.not_allowed, null);
    }

    // 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
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }

    // Cancel subscription
    node.cancelSubscription(subscription);
    // Send reply with success
    //router.route(IQ.createResultIQ(iq));
    return createSuccessPacket(iq);
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ getSubscriptionConfiguration(PubSubService service, IQ iq, Element childElement,
        Element optionsElement) {
    String nodeID = optionsElement.attributeValue("node");
    String subID = optionsElement.attributeValue("subid");
    Node node;//from  ww  w.j  ava2s.  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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
        }
    }
    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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        } 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"));
                return createErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
            }
        }
    } 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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
        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"));
            return createErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
        }
    }

    // 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
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }

    // 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());
    return reply;
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ configureSubscription(PubSubService service, IQ iq, Element optionsElement) {
    String nodeID = optionsElement.attributeValue("node");
    String subID = optionsElement.attributeValue("subid");
    Node node;//from   w  ww .jav a  2  s . c  o  m
    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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
        }
    }
    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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        } 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"));
                return createErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
            }
        }
    } 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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        }
        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"));
            return createErrorPacket(iq, PacketError.Condition.unexpected_request, pubsubError);
        }
    }

    // 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
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }

    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
        return createErrorPacket(iq, PacketError.Condition.bad_request, null);
    }
    return createSuccessPacket(iq);
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ getSubscriptions(PubSubService service, IQ iq, Element childElement) {
    // TODO Assuming that owner is the bare JID (as defined in the JEP). This can be replaced with an explicit owner specified in the packet
    JID owner = new JID(iq.getFrom().getNode(), iq.getFrom().getDomain(), null, true);
    Element subscriptionsElement = childElement.element("subscriptions");

    String nodeID = subscriptionsElement.attributeValue("node");
    Collection<NodeSubscription> subscriptions = new ArrayList<NodeSubscription>();

    if (nodeID == null) {
        // Collect subscriptions of owner for all nodes at the service
        for (Node node : service.getNodes()) {
            subscriptions.addAll(node.getSubscriptions(owner));
        }//from   ww  w .  ja va2s  .  c o  m
    } else {
        subscriptions.addAll(service.getNode(nodeID).getSubscriptions(owner));
    }

    // Create reply to send
    IQ reply = IQ.createResultIQ(iq);
    Element replyChildElement = childElement.createCopy();
    reply.setChildElement(replyChildElement);
    Element affiliationsElement = replyChildElement.element("subscriptions");
    // Add information about subscriptions including existing affiliations
    for (NodeSubscription subscription : subscriptions) {
        Element subElement = affiliationsElement.addElement("subscription");
        Node node = subscription.getNode();
        NodeAffiliate nodeAffiliate = subscription.getAffiliate();
        // Do not include the node id when node is the root collection node
        // or the results are for a specific node
        if (!node.isRootCollectionNode() && (nodeID == null)) {
            subElement.addAttribute("node", node.getNodeID());
        }
        subElement.addAttribute("jid", subscription.getJID().toString());
        subElement.addAttribute("subscription", subscription.getState().name());
        if (node.isMultipleSubscriptionsEnabled()) {
            subElement.addAttribute("subid", subscription.getID());
        }
    }
    return reply;
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ getPublishedItems(PubSubService service, IQ iq, Element itemsElement) {
    String nodeID = itemsElement.attributeValue("node");
    String subID = itemsElement.attributeValue("subid");
    Node node;//from  ww w  . jav  a2 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"));
        return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
    } else {
        // Look for the specified node
        node = service.getNode(nodeID);
        if (node == null) {
            // Node does not exist. Return item-not-found error
            return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
        }
    }
    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");
        return createErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
    }
    // 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 = new JID(subscriberJID.getNode(), subscriberJID.getDomain(), null, true);
    // Check if the node's access model allows the subscription to proceed
    AccessModel accessModel = node.getAccessModel();
    if (!accessModel.canAccessItems(node, owner, subscriberJID)) {
        return createErrorPacket(iq, accessModel.getSubsriptionError(),
                accessModel.getSubsriptionErrorDetail());
    }
    // Check that the requester is not an outcast
    NodeAffiliate affiliate = node.getAffiliate(owner);
    if (affiliate != null && affiliate.getAffiliation() == NodeAffiliate.Affiliation.outcast) {
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }

    // 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"));
            return createErrorPacket(iq, PacketError.Condition.bad_request, pubsubError);
        } 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"));
                return createErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
            }
        }
    }

    if (subscription != null && !subscription.isActive()) {
        Element pubsubError = DocumentHelper
                .createElement(QName.get("not-subscribed", "http://jabber.org/protocol/pubsub#errors"));
        return createErrorPacket(iq, PacketError.Condition.not_authorized, pubsubError);
    }

    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);

    //   FIXME:  Temporary return value
    return createSuccessPacket(iq);
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ createNode(PubSubService service, IQ iq, Element childElement, Element createElement) {
    // Get sender of the IQ packet
    JID from = iq.getFrom();/* ww w . jav  a  2s  . co  m*/
    // Verify that sender has permissions to create nodes
    if (!service.canCreateNode(from)) {
        // The user is not allowed to create nodes so return an error
        return createErrorPacket(iq, PacketError.Condition.forbidden, 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 createErrorPacket(iq, PacketError.Condition.not_acceptable, pubsubError);
        }
        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 createErrorPacket(iq, PacketError.Condition.item_not_found, null);
                    } else if (!tempNode.isCollectionNode()) {
                        // Requested parent node is not a collection node so return an error
                        return createErrorPacket(iq, PacketError.Condition.not_acceptable, 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 createErrorPacket(iq, PacketError.Condition.conflict, 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 createErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
    }

    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 createErrorPacket(iq, PacketError.Condition.forbidden, 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 createErrorPacket(iq, PacketError.Condition.conflict, pubsubError);
        }
    }

    // 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 = new JID(from.getNode(), from.getDomain(), null, true);
        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();
                }
            } else {
                conflict = true;
            }
        }
        if (conflict) {
            // There is a conflict since a node with the same ID already exists
            return createErrorPacket(iq, PacketError.Condition.conflict, null);
        } else {
            // Return success to the node owner
            IQ reply = IQ.createResultIQ(iq);
            // Include new nodeID if it has changed from the original nodeID
            if (!newNode.getNodeID().equals(nodeID)) {
                Element elem = reply.setChildElement("pubsub", "http://jabber.org/protocol/pubsub");
                elem.addElement("create").addAttribute("node", newNode.getNodeID());
            }
            return reply;
        }
    } catch (NotAcceptableException e) {
        // Node should have at least one owner. Return not-acceptable error.
        return createErrorPacket(iq, PacketError.Condition.not_acceptable, null);
    }
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ 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");
        return createErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
    }//from w  ww.  ja  va2 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());
    return reply;
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ deleteNode(PubSubService service, IQ iq, Element deleteElement) {
    String nodeID = deleteElement.attributeValue("node");
    if (nodeID == null) {
        // NodeID was not provided. Return bad-request error
        return createErrorPacket(iq, PacketError.Condition.bad_request, null);
    }//from w  ww .  jav  a 2s .  c  om
    Node node = service.getNode(nodeID);
    if (node == null) {
        // Node does not exist. Return item-not-found error
        return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
    }
    if (!node.isAdmin(iq.getFrom())) {
        // Requesting entity is prohibited from deleting this node. Return forbidden error
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }
    if (node.isRootCollectionNode()) {
        // Root collection node cannot be deleted. Return not-allowed error
        return createErrorPacket(iq, PacketError.Condition.not_allowed, null);
    }

    // Delete the node
    if (node.delete()) {
        // Return that node was deleted successfully
        return createSuccessPacket(iq);
    } else {
        // Some error occured while trying to delete the node
        return createErrorPacket(iq, PacketError.Condition.internal_server_error, null);
    }
}

From source file:com.adspore.splat.xep0060.PubSubEngine.java

License:Open Source License

private static IQ purgeNode(PubSubService service, IQ iq, Element purgeElement) {
    String nodeID = purgeElement.attributeValue("node");
    if (nodeID == null) {
        // NodeID was not provided. Return bad-request error
        return createErrorPacket(iq, PacketError.Condition.bad_request, null);
    }//from   w w  w.j av  a2s .c  om
    Node node = service.getNode(nodeID);
    if (node == null) {
        // Node does not exist. Return item-not-found error
        return createErrorPacket(iq, PacketError.Condition.item_not_found, null);
    }
    if (!node.isAdmin(iq.getFrom())) {
        // Requesting entity is prohibited from configuring this node. Return forbidden error
        return createErrorPacket(iq, PacketError.Condition.forbidden, null);
    }
    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");
        return createErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
    }
    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");
        return createErrorPacket(iq, PacketError.Condition.feature_not_implemented, pubsubError);
    }

    // Purge the node
    ((LeafNode) node).purge();
    return createSuccessPacket(iq);
}