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().writeSafeUTF(out, owner.toString());
		ExternalizableUtil.getInstance().writeSafeUTF(out, subJid.toString());
		ExternalizableUtil.getInstance().writeSerializable(out, state);
	}

	@Override
	public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
	{
		super.readExternal(in);
		subId = ExternalizableUtil.getInstance().readSafeUTF(in);
		owner = new JID(ExternalizableUtil.getInstance().readSafeUTF(in));
		subJid = new JID(ExternalizableUtil.getInstance().readSafeUTF(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 + ")]";
	}
}
