package org.jivesoftware.openfire.pubsub.cluster;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

import org.jivesoftware.openfire.pubsub.NodeSubscription;
import org.jivesoftware.openfire.pubsub.NodeSubscription.State;
import org.jivesoftware.util.cache.ExternalizableUtil;
import org.xmpp.packet.JID;

public abstract class SubscriptionTask extends NodeTask
{
    private String subId;
    private JID owner;
    private JID subJid;
    private NodeSubscription.State state;
    transient private NodeSubscription subscription;

    public SubscriptionTask()
    {
    }

    public SubscriptionTask(NodeSubscription subscription)
    {
        super(subscription.getNode());
        subId = subscription.getID();
        state = subscription.getState();
        owner = subscription.getOwner();
        subJid = subscription.getJID();
    }

    public String getSubscriptionId()
    {
        return subId;
    }

    public JID getOwner()
    {
        return owner;
    }

    public JID getSubscriberJid()
    {
        return subJid;
    }

    public NodeSubscription.State getState()
    {
        return state;
    }

    public NodeSubscription getSubscription()
    {
        if (subscription == null)
        {
            subscription = new NodeSubscription(getNode(), owner, subJid, state, subId);
        }
        return subscription;
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException
    {
        super.writeExternal(out);
        ExternalizableUtil.getInstance().writeSafeUTF(out, subId);
        ExternalizableUtil.getInstance().writeSerializable(out, owner);
        ExternalizableUtil.getInstance().writeSerializable(out, subJid);
        ExternalizableUtil.getInstance().writeSerializable(out, state);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        super.readExternal(in);
        subId = ExternalizableUtil.getInstance().readSafeUTF(in);
        owner = (JID) ExternalizableUtil.getInstance().readSerializable(in);
        subJid = (JID) ExternalizableUtil.getInstance().readSerializable(in);
        state = (State) ExternalizableUtil.getInstance().readSerializable(in);
    }

    @Override
    public String toString()
    {
        return getClass().getSimpleName() + " [(service=" + serviceId + "), (nodeId=" + nodeId + "), (owner=" + owner
                + "),(subscriber=" + subJid + "),(state=" + state + "),(id=" + subId + ")]";
    }
}
