/**
* Copyright 2008 Google Inc.
*
* 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.waveprotocol.wave.concurrencycontrol.channel;
import org.waveprotocol.wave.concurrencycontrol.common.ChannelException;
import org.waveprotocol.wave.model.operation.wave.WaveletOperation;
import org.waveprotocol.wave.model.version.HashedVersion;
import java.util.List;
/**
* A client socket for a wavelet. Sends/receives operations to/from the wave
* server and transforms (outbound) client operations against (inbound) server
* operations.
*
* An operation channel can operate without network connection to the server by
* queuing outbound operations until a network connection is established at a
* later time.
*
* If the network connection fails during operation, or the wave server restarts
* or fails over, a channel will silently try to reconnect and recover (by
* selectively retransforming and retransmitting relevant client operations) but
* will notify if recovery fails.
*
*/
public interface OperationChannel {
/**
* A listener for operations being received by a channel.
*/
public interface Listener {
/**
* Invoked when a remote operation received to the channel.
*/
void onOperationReceived();
}
/**
* Sets the channel listener.
*
* @param listener
*/
void setListener(Listener listener);
/**
* Sends client operations to the wave server.
* If the channel is not connected, the operations are queued.
*
* @param operations client operations to send
* @throws ChannelException if the channel is corrupt or misused
*/
void send(WaveletOperation ... operations) throws ChannelException;
/**
* Receive (transformed) server operation from the wave server, if any is available.
*
* @return the next server operation, if any is received from the server (and makes it
* through transformation), null otherwise
*/
WaveletOperation receive();
/**
* Peek at the next (transformed) server operation from the wave server, if any is available.
*
* @return the next server operation, if any is received from the server (and makes it
* through transformation), null otherwise
*/
WaveletOperation peek();
/**
* Gets the wavelet versions at which this channel could reconnect.
*/
List<HashedVersion> getReconnectVersions();
/**
* @return A dump of the state of cc stack. This is really only used for debugging purposes.
*/
String getDebugString();
}