package org.jivesoftware.openfire.pubsub.cluster;

import org.jivesoftware.openfire.pubsub.Node;
import org.jivesoftware.openfire.pubsub.NodeAffiliate;
import org.jivesoftware.openfire.pubsub.NodeSubscription;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class NewSubscriptionTask extends SubscriptionTask
{
    private static final Logger log = LoggerFactory.getLogger(NewSubscriptionTask.class);

    public NewSubscriptionTask()
    {

    }

    public NewSubscriptionTask(NodeSubscription subscription)
    {
        super(subscription);
    }

    @Override
    public void run()
    {
        log.debug("[TASK] New subscription : {}", toString());

        Node node = getNode();

        // This will only occur if a PEP service is not loaded.  We can safely do nothing in this 
        // case since any changes will get loaded from the db when it is loaded.
        if (node == null)
            return;

        if (node.getAffiliate(getOwner()) == null)
        {
            // add the missing 'none' affiliation
            NodeAffiliate affiliate = new NodeAffiliate(node, getOwner());
            affiliate.setAffiliation(NodeAffiliate.Affiliation.none);
            node.addAffiliate(affiliate);
        }
        node.addSubscription(getSubscription());

        if (node.isPresenceBasedDelivery() && node.getSubscriptions(getSubscription().getOwner()).size() == 1)
        {
            if (getSubscription().getPresenceStates().isEmpty())
            {
                // Subscribe to the owner's presence since the node is only
                // sending events to online subscribers and this is the first
                // subscription of the user and the subscription is not
                // filtering notifications based on presence show values.
                getService().presenceSubscriptionRequired(getNode(), getOwner());
            }
        }
    }
}
