private void configureNode(PubSubService service, IQ iq, Element configureElement, String nodeID) {
        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 not allowed to get node configuration. Return forbidden error
            sendErrorPacket(iq, PacketError.Condition.forbidden, null);
            return;
        }

        // Get the data form that contains the parent nodeID
        DataForm completedForm = getSentConfigurationForm(configureElement);
        if (completedForm != null) {
            try {
                // Update node configuration with the provided data form
                // (and update the backend store)
                node.configure(completedForm);

                // TODO Replace with a cluster task that does not interact with the database (OF-2141).
                CacheFactory.doClusterTask(new RefreshNodeTask(node));

                // Return that node configuration was successful
                router.route(IQ.createResultIQ(iq));
            }
            catch (NotAcceptableException e) {
                // Node should have at least one owner. Return not-acceptable error.
                sendErrorPacket(iq, PacketError.Condition.not_acceptable, null);
            }
        }
        else {
            // No data form was included so return bad-request error
            sendErrorPacket(iq, PacketError.Condition.bad_request, null);
        }
    }
Checks if the following conditions are satisfied and creates a node
- Requester can create nodes
- Instant node creation is enabled
- Node does not already exist
- New node configuration is valid

<br>NOTE 1: This method should not reply to the client
<br>NOTE 2: This method calls UserManager::isRegisteredUser(JID) which can block waiting for a response - so
do not call this method in the same thread in which a response might arrive

@param service The service instance that's responsible for processing (cannot be null)
@param requester The (full) JID of the entity that performs the action (cannot be null)
@param configuration Optional Configuration dataform, if user requested to configure the node (can be null)
@param nodeID The ID of the node to be created, or null when an instant node is to be created.
@param publishOptions Optional Publishing Options, which are either preconditions or configuration overrides (can be null)
@return {@link CreateNodeResponse}
xmppserver/src/main/java/org/jivesoftware/openfire/pubsub/PubSubEngine.java