/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 net.jini.jeri.connection;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.channels.SocketChannel;
import java.util.Collection;
import net.jini.core.constraint.InvocationConstraints;
import net.jini.io.UnsupportedConstraintException;
import net.jini.jeri.InboundRequest;
import net.jini.jeri.ServerEndpoint;
/**
* Represents an established server-side connection. For example, a
* TCP-based <code>ServerConnection</code> implementation typically
* contains a {@link Socket}.
*
* <p><code>ServerConnection</code> is implemented by a
* connection-based {@link ServerEndpoint} implementation that uses
* {@link ServerConnectionManager} for managing connections. A
* <code>ServerConnection</code> is created by the implementation for
* newly-accepted connections and passed to the manager's {@link
* ServerConnectionManager#handleConnection handleConnection} method.
*
* @author Sun Microsystems, Inc.
* @since 2.0
**/
public interface ServerConnection {
/**
* Returns an input stream that reads data from this connection.
*
* @return an input stream that reads data from this connection
*
* @throws IOException if an I/O exception occurs
**/
InputStream getInputStream() throws IOException;
/**
* Returns an output stream that writes data to this connection.
*
* @return an output stream that writes data to this connection
*
* @throws IOException if an I/O exception occurs
**/
OutputStream getOutputStream() throws IOException;
/**
* Returns a socket channel that performs I/O on this connection,
* or <code>null</code> if no socket channel is available. If a
* non-<code>null</code> socket channel is returned, it is
* connected.
*
* @return a socket channel that performs I/O on this connection,
* or <code>null</code>
**/
SocketChannel getChannel();
/**
* Reads from the specified input stream any per-request data required by
* this connection for an inbound request, writes any required response
* data to the specified output stream, and returns a handle for the
* request.
*
* <p>This method is invoked by
* <code>ServerConnectionManager</code> with the request input
* stream and the response output stream of the {@link
* InboundRequest} that it creates for the request when the
* request is first received. This method reads information that
* was sent by {@link Connection#writeRequestData
* Connection.writeRequestData} and writes information to be read
* by {@link Connection#readResponseData
* Connection.readResponseData}. This method can be used, for
* example, to process per-request information about delegation,
* client authentication, or client privileges.
*
* <p>If, for security reasons, this method determines that the
* request must not be processed further (for example, because
* client authentication failed), this method should close the
* response output stream and throw a
* <code>SecurityException</code> after writing any response data.
*
* <p>There may be multiple requests in progress concurrently over
* this connection, and data read from and written to the
* specified streams may be buffered and multiplexed with data
* from other requests on this connection's underlying streams.
* Therefore, this method should only read data from the request
* input stream and write data to the response output stream and
* must not otherwise read from or write to this connection's
* underlying streams.
*
* @param in the request input stream of the request
*
* @param out the response output stream of the request
*
* @return a handle to identify the request in later invocations
* on this connection
*
* @throws NullPointerException if <code>in</code> or
* <code>out</code> is <code>null</code>
*
* @throws IOException if an I/O exception occurs
*
* @throws SecurityException if a security exception occurs
**/
InboundRequestHandle processRequestData(InputStream in, OutputStream out)
throws IOException;
/**
* Implements {@link InboundRequest#checkPermissions
* InboundRequest.checkPermissions} for a request with the
* specified handle.
*
* @param handle the handle for the request
*
* @throws SecurityException if the current security context does
* not have the permissions necessary to receive the request
*
* @throws IllegalArgumentException if the specified handle was
* not returned from this connection's
* <code>processRequestData</code> method
*
* @throws NullPointerException if <code>handle</code> is
* <code>null</code>
**/
void checkPermissions(InboundRequestHandle handle);
/**
* Implements {@link InboundRequest#checkConstraints
* InboundRequest.checkConstraints} for a request with the
* specified handle.
*
* @param handle the handle for the request
*
* @param constraints the constraints that must be satisfied
*
* @return the constraints that must be at least partially
* implemented by higher layers
*
* @throws UnsupportedConstraintException if the transport layer
* aspects of any of the specified requirements are not satisfied
* by this request
*
* @throws IllegalArgumentException if the specified handle was
* not returned from this connection's
* <code>processRequestData</code> method
*
* @throws NullPointerException if <code>handle</code> or
* <code>constraints</code> is <code>null</code>
**/
InvocationConstraints checkConstraints(InboundRequestHandle handle,
InvocationConstraints constraints)
throws UnsupportedConstraintException;
/**
* Populates the supplied collection with context information
* representing a request with the specified handle. This method
* is used to implement {@link InboundRequest#populateContext
* InboundRequest.populateContext} for such requests; the context
* may also be populated by the connection manager.
*
* @param handle the handle for the request
*
* @param context the context collection to populate
*
* @throws IllegalArgumentException if the specified handle was
* not returned from this connection's
* <code>processRequestData</code> method
*
* @throws NullPointerException if <code>handle</code> or
* <code>context</code> is <code>null</code>
*
* @throws UnsupportedOperationException if <code>context</code>
* is unmodifiable
**/
void populateContext(InboundRequestHandle handle, Collection context);
/**
* Closes this connection.
*
* @throws IOException if an I/O exception occurs
**/
void close() throws IOException;
}