001    /*
002     * CDDL HEADER START
003     *
004     * The contents of this file are subject to the terms of the
005     * Common Development and Distribution License, Version 1.0 only
006     * (the "License").  You may not use this file except in compliance
007     * with the License.
008     *
009     * You can obtain a copy of the license at
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2006-2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.replication.protocol;
028    
029    import java.io.IOException;
030    import java.net.SocketException;
031    import java.util.zip.DataFormatException;
032    
033    /**
034     * The ProtocolSession interface should be implemented by a class that
035     * implement the send/reception part of the Multi-master replication
036     * protocol.
037     *
038     * This interface is designed to make easy the move from one format
039     * of the ReplicationMessage on the wire to another format.
040     */
041    public interface ProtocolSession
042    {
043    
044      /**
045       * This method is called when the session with the remote must be closed.
046       * This object won't be used anymore after this method is called.
047       *
048       * @throws IOException If an error happen during the close process.
049       */
050      public abstract void close() throws IOException;
051    
052      /**
053       * This method is called when a ReplicationMessage must be sent to
054       * the remote entity.
055       *
056       * It can be called by several threads and must implement appropriate
057       * replication (typically, this method or a part of it should be
058       * synchronized).
059       *
060       * @param msg The ReplicationMessage that must be sent.
061       * @throws IOException If an IO error happen during the publish process.
062       */
063      public abstract void publish(ReplicationMessage msg)
064                      throws IOException;
065    
066      /**
067       * Attempt to receive a ReplicationMessage.
068       * This method should block the calling thread until a
069       * ReplicationMessage is available or until an error condition.
070       *
071       * This method can only be called by a single thread and therefore does not
072       * neet to implement any replication.
073       *
074       * @return The ReplicationMessage that was received.
075       * @throws IOException When error happened durin IO process.
076       * @throws ClassNotFoundException When the data received does extend the
077       *         ReplicationMessage class.
078       * @throws DataFormatException When the data received is not formatted as a
079       *         ReplicationMessage.
080       */
081      public abstract ReplicationMessage receive()
082                      throws IOException, ClassNotFoundException,
083                             DataFormatException;
084    
085      /**
086       * Stop using the security layer, if there is any.
087       */
088      public abstract void stopEncryption();
089    
090      /**
091       * Determine whether the session is using a security layer.
092       * @return true if the connection is encrypted, false otherwise.
093       */
094      public abstract boolean isEncrypted();
095    
096      /**
097       * Retrieve the IP address of the remote server.
098       *
099       * @return The IP address of the remote server.
100       */
101      public abstract String getRemoteAddress();
102    
103    
104      /**
105      * Set a timeout value.
106      * With this option set to a non-zero value, calls to the receive() method
107      * block for only this amount of time after which a
108      * java.net.SocketTimeoutException is raised.
109      * The Broker is valid and useable even after such an Exception is raised.
110      *
111      * @param timeout the specified timeout, in milliseconds.
112      * @throws SocketException if there is an error in the underlying protocol,
113      *         such as a TCP error.
114      */
115      public abstract void setSoTimeout(int timeout) throws SocketException;
116    
117    
118    
119      /**
120       * Gets the time the last replication message was published on this
121       * session.
122       * @return The timestamp in milliseconds of the last message published.
123       */
124      public abstract long getLastPublishTime();
125    
126    
127    
128      /**
129       * Gets the time the last replication message was received on this
130       * session.
131       * @return The timestamp in milliseconds of the last message received.
132       */
133      public abstract long getLastReceiveTime();
134    }