001    /**
002     * Copyright (C) 2012 FuseSource, Inc.
003     * http://fusesource.com
004     *
005     * Licensed under the Apache License, Version 2.0 (the "License");
006     * you may not use this file except in compliance with the License.
007     * You may obtain a copy of the License at
008     *
009     *    http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.fusesource.hawtdispatch.transport;
019    
020    import java.io.IOException;
021    import java.net.SocketAddress;
022    import java.net.URI;
023    import java.nio.channels.ReadableByteChannel;
024    import java.nio.channels.WritableByteChannel;
025    import java.util.concurrent.Executor;
026    
027    import org.fusesource.hawtdispatch.DispatchQueue;
028    import org.fusesource.hawtdispatch.Task;
029    
030    /**
031     * Represents an abstract connection.  It can be a client side or server side connection.
032     * 
033     * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
034     */
035    public interface Transport {
036    
037        /**
038         * Starts the service.  Executes the onComplete runnable once the service has fully started up.
039         *
040         * @param onComplete my be set to null if not interested in a callback.
041         */
042        void start(Runnable onComplete);
043    
044        /**
045         * Stops the service.  Executes the onComplete runnable once the service has fully stopped.
046         *
047         * @param onComplete my be set to null if not interested in a callback.
048         */
049        void stop(Runnable onComplete);
050    
051        /**
052         * Starts the service.  Executes the onComplete runnable once the service has fully started up.
053         *
054         * @param onComplete my be set to null if not interested in a callback.
055         */
056        void start(Task onComplete);
057    
058        /**
059         * Stops the service.  Executes the onComplete runnable once the service has fully stopped.
060         *
061         * @param onComplete my be set to null if not interested in a callback.
062         */
063        void stop(Task onComplete);
064    
065        boolean full();
066    
067        /**
068         * A one way asynchronous send of a command.  Only sent if the the transport is not full.
069         * 
070         * @param command
071         * @return true if the command was accepted.
072         */
073        boolean offer(Object command);
074    
075        /**
076         * Forces a flush of any output buffers.  Once the flush completes the listener's
077         * 'onRefill()' method will execute.
078         */
079        public void flush();
080    
081        /**
082         * Returns the current transport listener
083         *
084         * @return
085         */
086        TransportListener getTransportListener();
087    
088        /**
089         * Registers an inbound command listener
090         *
091         * @param transportListener
092         */
093        void setTransportListener(TransportListener transportListener);
094    
095        /**
096         * Returns the dispatch queue used by the transport
097         *
098         * @return
099         */
100        DispatchQueue getDispatchQueue();
101    
102        /**
103         * Sets the dispatch queue used by the transport
104         *
105         * @param queue
106         */
107        void setDispatchQueue(DispatchQueue queue);
108    
109        /**
110         * suspend delivery of commands.
111         */
112        void suspendRead();
113    
114        /**
115         * resume delivery of commands.
116         */
117        void resumeRead();
118    
119        /**
120         * @return the remote address for this connection
121         */
122        SocketAddress getRemoteAddress();
123    
124        /**
125         * @return the remote address for this connection
126         */
127        SocketAddress getLocalAddress();
128    
129        public void drainInbound();
130    
131        /**
132         * @return true if the transport is closed/stopped.
133         */
134        boolean isClosed();
135        
136        /**
137         * @return true if the transport is connected
138         */
139        boolean isConnected();
140        
141        /**
142         * @return The protocol codec for the transport.
143         */
144        ProtocolCodec getProtocolCodec();
145    
146        /**
147         * Sets the protocol codec for the transport
148         * @param protocolCodec
149         */
150        void setProtocolCodec(ProtocolCodec protocolCodec) throws Exception;
151    
152        public Executor getBlockingExecutor();
153        public void setBlockingExecutor(Executor blockingExecutor);
154    
155        ReadableByteChannel getReadChannel();
156        WritableByteChannel getWriteChannel();
157    }