/*
* 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;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import net.jini.core.constraint.ConstraintAlternatives;
import net.jini.core.constraint.Delegation;
import net.jini.core.constraint.Integrity;
import net.jini.core.constraint.InvocationConstraints;
import net.jini.io.UnsupportedConstraintException;
import net.jini.security.AuthenticationPermission;
/**
* Represents a request that is being received and the corresponding
* response to be sent in reply.
*
* <p>An <code>InboundRequest</code> can be used to read in the
* contents of the request and write out the response.
*
* @author Sun Microsystems, Inc.
* @see OutboundRequest
* @see RequestDispatcher
* @since 2.0
**/
public interface InboundRequest {
/**
* Verifies that the current security context has all of the
* security permissions necessary to receive this request.
*
* <p>This method should be used when a particular shared
* mechanism is used to receive requests for a variety of
* interested parties, each with potentially different security
* permissions possibly more limited than those granted to the
* code managing the shared mechanism, so that the managing code
* can verify proper access control for each party.
*
* <p>For example, a TCP-based <code>InboundRequest</code>
* implementation typically implements this method by invoking the
* {@link SecurityManager#checkAccept checkAccept} method of the
* current security manager (if any) with the client's host
* address and TCP port. An implementation that supports
* authentication typically checks that the current security
* context has the necessary {@link AuthenticationPermission} with
* <code>accept</code> action.
*
* @throws SecurityException if the current security context does
* not have the permissions necessary to receive this request
**/
void checkPermissions();
/**
* Verifies that this request satisfies the transport layer
* aspects of all of the specified requirements, and returns the
* requirements that must be at least partially implemented by
* higher layers in order to fully satisfy the specified
* requirements. This method may also return preferences that
* must be at least partially implemented by higher layers in
* order to fully satisfy some of the specified preferences.
*
* <p>For any given constraint, there must be a clear delineation
* of which aspects (if any) must be implemented by the transport
* layer. This method must not return a constraint (as a
* requirement or a preference, directly or as an element of
* another constraint) unless this request implements all of those
* aspects. Also, this method must not return a constraint for
* which all aspects must be implemented by the transport layer.
* Most of the constraints in the {@link net.jini.core.constraint}
* package must be fully implemented by the transport layer and
* thus must not be returned by this method; the one exception is
* {@link Integrity}, for which the transport layer is responsible
* for the data integrity aspect and higher layers are responsible
* for the code integrity aspect.
*
* <p>For any {@link ConstraintAlternatives} in the specified
* constraints, this method should only return a corresponding
* constraint if all of the alternatives satisfied by this request
* need to be at least partially implemented by higher layers in
* order to be fully satisfied.
*
* <p>The constraints actually in force may cause conditional
* constraints to have to be satisfied. For example, if the only
* requirement specified is {@link Delegation#YES Delegation.YES}
* but the client was in fact authenticated, then the client must
* also have delegated to the server.
*
* <p>The constraints passed to this method may include
* constraints based on relative time.
*
* @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 NullPointerException if <code>constraints</code> is
* <code>null</code>
**/
InvocationConstraints checkConstraints(InvocationConstraints constraints)
throws UnsupportedConstraintException;
/**
* Populates the supplied collection with context information
* representing this request.
*
* @param context the context collection to populate
*
* @throws NullPointerException if <code>context</code> is
* <code>null</code>
*
* @throws UnsupportedOperationException if <code>context</code>
* is unmodifiable and if any elements need to be added
**/
void populateContext(Collection context);
/**
* Returns an <code>InputStream</code> to read the request data
* from. The sequence of bytes produced by reading from the
* returned stream will be the sequence of bytes received as the
* request data. When the entirety of the request has been
* successfully read, reading from the stream will indicate an
* EOF.
*
* <p>Invoking the <code>close</code> method of the returned
* stream will cause any subsequent read operations on the stream
* to fail with an <code>IOException</code>, although it will not
* terminate this request as a whole; in particular, the response
* may still be subsequently written to the stream returned by the
* <code>getResponseOutputStream</code> method. After
* <code>close</code> has been invoked on both the returned stream
* and the stream returned by
* <code>getResponseOutputStream</code>, the implementation may
* free all resources associated with this request.
*
* <p>If this method is invoked more than once, it will always
* return the identical stream object that it returned the first
* time (although the stream may be in a different state than it
* was upon return from the first invocation).
*
* @return the input stream to read request data from
**/
InputStream getRequestInputStream();
/**
* Returns an <code>OutputStream</code> to write the response data
* to. The sequence of bytes written to the returned stream will
* be the sequence of bytes sent as the response.
*
* <p>After the entirety of the response has been written to the
* stream, the stream's <code>close</code> method must be invoked
* to ensure complete delivery of the response. It is possible
* that none of the data written to the returned stream will be
* delivered before <code>close</code> has been invoked (even if
* the stream's <code>flush</code> method has been invoked at any
* time). Note, however, that some or all of the data written to
* the stream may be delivered to (and processed by) the recipient
* before the stream's <code>close</code> method has been invoked.
*
* <p>After the stream's <code>close</code> method has been
* invoked, no more data may be written to the stream; writes
* subsequent to a <code>close</code> invocation will fail with an
* <code>IOException</code>.
*
* <p>If this method is invoked more than once, it will always
* return the identical stream object that it returned the first
* time (although the stream may be in a different state than it
* was upon return from the first invocation).
*
* @return the output stream to write response data to
**/
OutputStream getResponseOutputStream();
/**
* Terminates this request, freeing all associated resources.
*
* <p>This method may be invoked at any stage of the processing of
* the request.
*
* <p>After this method has been invoked, I/O operations on the
* streams returned by the <code>getRequestInputStream</code> and
* <code>getResponseOutputStream</code> methods will fail with an
* <code>IOException</code>, except some operations that may
* succeed because they only affect data in local I/O buffers.
*
* <p>If this method is invoked before the <code>close</code>
* method has been invoked on the stream returned by
* <code>getResponseOutputStream</code>, there is no guarantee
* that any or none of the data written to the stream so far will
* be delivered; the implication of such an invocation of this
* method is that the user is no longer interested in the
* successful delivery of the response.
**/
void abort();
}