/*
 * Copyright 1999,2004-2005 The Apache Software Foundation.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.apache.catalina.tribes.transport.bio.util;

import org.apache.catalina.tribes.ChannelMessage;
import org.apache.catalina.tribes.ErrorHandler;
import org.apache.catalina.tribes.Member;
import org.apache.catalina.tribes.group.InterceptorPayload;

/**
 * The class <b>LinkObject</b> implements an element
 * for a linked list, consisting of a general
 * data object and a pointer to the next element.
 *
 * @author Rainer Jung
 * @author Peter Rossbach
 * @author Filip Hanik
 * @version $Revision: 304032 $ $Date: 2005-07-27 10:11:55 -0500 (Wed, 27 Jul 2005) $

 */

public class LinkObject {

    private ChannelMessage msg;
    private LinkObject next;
    private byte[] key ;
    private Member[] destination;
    private InterceptorPayload payload;

    /**
     * Construct a new element from the data object.
     * Sets the pointer to null.
     *
     * @param key The key
     * @param payload The data object.
     */
    public LinkObject(ChannelMessage msg, Member[] destination, InterceptorPayload payload) {
        this.msg = msg;
        this.next = null;
        this.key = msg.getUniqueId();
        this.payload = payload;
        this.destination = destination;
    }

    /**
     * Set the next element.
     * @param next The next element.
     */
    public void append(LinkObject next) {
        this.next = next;
    }

    /**
     * Get the next element.
     * @return The next element.
     */
    public LinkObject next() {
        return next;
    }
    
    public void setNext(LinkObject next) {
        this.next = next;
    }

    /**
     * Get the data object from the element.
     * @return The data object from the element.
     */
    public ChannelMessage data() {
        return msg;
    }

    /**
     * Get the unique message id
     * @return the unique message id
     */
    public byte[] getKey() {
        return key;
    }

    public ErrorHandler getHandler() {
        return payload!=null?payload.getErrorHandler():null;
    }

    public InterceptorPayload getPayload() {
        return payload;
    }

    public Member[] getDestination() {
        return destination;
    }

}
