/*
 * 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.tribes;


/**
 * ChannelReceiver Interface<br>
 * The <code>ChannelSender</code> interface is the data sender component 
 * at the bottom layer, the IO layer (for layers see the javadoc for the {@link Channel} interface).<br>
 * The channel sender must support "silent" members, ie, be able to send a message to a member
 * that is not in the membership, but is part of the destination parameter
 * @author Filip Hanik
 * @version $Revision: 379904 $, $Date: 2006-02-22 15:16:25 -0600 (Wed, 22 Feb 2006) $
 */
public interface ChannelSender extends Heartbeat
{
    /**
     * Notify the sender of a member being added to the group.<br>
     * Optional. This can be an empty implementation, that does nothing
     * @param member Member
     */
    public void add(Member member);
    /**
     * Notification that a member has been removed or crashed.
     * Can be used to clean up open connections etc
     * @param member Member
     */
    public void remove(Member member);
    
    /**
     * Start the channel sender
     * @throws IOException if preprocessing takes place and an error happens
     */
    public void start() throws java.io.IOException;
    /**
     * Stop the channel sender
     */
    public void stop();
    
    /**
     * A channel heartbeat, use this method to clean up resources
     */
    public void heartbeat() ;
    
    /**
     * Send a message to one or more recipients.
     * @param message ChannelMessage - the message to be sent
     * @param destination Member[] - the destinations
     * @throws ChannelException - if an error happens, the ChannelSender MUST report
     * individual send failures on a per member basis, using ChannelException.addFaultyMember
     * @see ChannelException#addFaultyMember(Member,java.lang.Exception)
     */
    public void sendMessage(ChannelMessage message, Member[] destination) throws ChannelException;
}
