/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package com.sun.messaging.jmq.jmsserver.data;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

import com.sun.messaging.jmq.io.Packet;
import com.sun.messaging.jmq.jmsserver.core.ConsumerUID;
import com.sun.messaging.jmq.jmsserver.core.DestinationUID;
import com.sun.messaging.jmq.jmsserver.core.PacketReference;
import com.sun.messaging.jmq.jmsserver.util.BrokerException;

public class TransactionWorkMessage {

	private DestinationUID destUID;
	private Packet message;
	private ConsumerUID[] storedInterests;
	private PacketReference packetRef;

	public TransactionWorkMessage(DestinationUID destUID, Packet message, ConsumerUID[] storedInterests) {
		this.destUID = destUID;
		this.message = message;
		this.storedInterests = storedInterests;
	}
	
	public TransactionWorkMessage() {			
	}

	public DestinationUID getDestUID() {
		return destUID;
	}

	public void setDestUID(DestinationUID destUID) {
		this.destUID = destUID;
	}

	public Packet getMessage() {
		return message;
	}
	
	public PacketReference getPacketReference() {
		return packetRef;
	}

	public void setPacketReference(PacketReference ref) {
		this.packetRef= ref;
		this.message = ref.getPacket();
	}

	public String toString()
	{
		StringBuffer result= new StringBuffer("sysMessageID=").append(message.getMessageID());
		result.append(" destUID=").append(destUID);
		result.append(" dest=").append(message.getDestination());
	
		return result.toString();
	}

	public ConsumerUID[] getStoredInterests() {
		return storedInterests;
	}

	public void setStoredInterests(ConsumerUID[] storedInterests) {
		this.storedInterests = storedInterests;
	}
	
	public void writeWork(DataOutputStream dos) throws IOException {

		byte[] data = getMessage().getBytes();

		dos.write(data); // Message			
		ConsumerUID[] storedInterests = getStoredInterests();
		if (storedInterests == null) {
			dos.writeInt(0);
		} else {
			dos.writeInt(storedInterests.length);
			for (int i = 0; i < storedInterests.length; i++) {
				dos.writeLong(storedInterests[i].longValue());
			}
		}
	}
	
	public void readWork(DataInputStream dis) throws IOException,
			BrokerException {
		message = new Packet(false);
		message.generateTimestamp(false);
		message.generateSequenceNumber(false);
		message.readPacket(dis);

		int numStoredInterests = dis.readInt();
		storedInterests = new ConsumerUID[numStoredInterests];
		for (int j = 0; j < numStoredInterests; j++) {
			long cuid = dis.readLong();
			storedInterests[j] = new ConsumerUID(cuid);
		}

		// Make sure dest exists; auto-create if possible
		// this is because we will need to add messages to this
		// destination
		destUID = DestinationUID.getUID(message.getDestination(), message
				.getIsQueue());

	}
	
}
