/*
 * Copyright 1999,2004 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.ha.tcp;

import org.apache.catalina.tribes.Member;

/**
 * @author Peter Rossbach
 * @version $Revision: 303987 $ $Date: 2005-07-08 15:50:30 -0500 (Fri, 08 Jul 2005) $
 */
public class SendMessageData {

    private Object message ;
    private Member destination ;
    private Exception exception ;
    
    
    /**
     * @param message
     * @param destination
     * @param exception
     */
    public SendMessageData(Object message, Member destination,
            Exception exception) {
        super();
        this.message = message;
        this.destination = destination;
        this.exception = exception;
    }
    
    /**
     * @return Returns the destination.
     */
    public Member getDestination() {
        return destination;
    }
    /**
     * @param destination The destination to set.
     */
    public void setDestination(Member destination) {
        this.destination = destination;
    }
    /**
     * @return Returns the exception.
     */
    public Exception getException() {
        return exception;
    }
    /**
     * @param exception The exception to set.
     */
    public void setException(Exception exception) {
        this.exception = exception;
    }
    /**
     * @return Returns the message.
     */
    public Object getMessage() {
        return message;
    }
    /**
     * @param message The message to set.
     */
    public void setMessage(Object message) {
        this.message = message;
    }
}
