/*
* 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.IOException;
import java.rmi.NoSuchObjectException;
import java.rmi.RemoteException;
import net.jini.core.constraint.InvocationConstraints;
/**
* References a remote object at a remote communication endpoint to
* send requests to.
*
* <p>An <code>ObjectEndpoint</code> instance contains the information
* necessary to identify the remote object and to send requests to the
* remote object.
*
* <p>The {@link #newCall newCall} method can be used to send a
* request to the remote object that this object references.
*
* @author Sun Microsystems, Inc.
* @since 2.0
**/
public interface ObjectEndpoint {
/**
* Returns an <code>OutboundRequestIterator</code> to use to send
* a new remote call to the referenced remote object using the
* specified constraints.
*
* <p>The constraints must be the complete, absolute constraints
* for the remote call, combining any client and server
* constraints for the remote method being invoked, with no
* relative time constraints.
*
* <p>For each {@link OutboundRequest} produced by the returned
* <code>OutboundRequestIterator</code>, after writing the request
* data and before reading any response data, {@link #executeCall
* executeCall} must be invoked to execute the call.
*
* @param constraints the complete, absolute constraints
*
* @return an <code>OutboundRequestIterator</code> to use to send
* a new remote call to the referenced remote object
*
* @throws NullPointerException if <code>constraints</code> is
* <code>null</code>
**/
public OutboundRequestIterator newCall(InvocationConstraints constraints);
/**
* Synchronously executes a remote call in progress to the
* identified remote object, so that the response can be read.
*
* <p>This method should be passed an <code>OutboundRequest</code>
* that was produced by an <code>OutboundRequestIterator</code>
* returned from this object's {@link #newCall newCall} method.
* This method must be invoked after writing the request data to
* and before reading any response data from the
* <code>OutboundRequest</code>.
*
* <p>If the remote call was successfully executed (such that the
* response data may now be read) this method returns
* <code>null</code>. This method returns a non-<code>null</code>
* <code>RemoteException</code> to indicate a
* <code>RemoteException</code> that the remote call should fail
* with. For example, if the referenced object does not exist at
* the remote endpoint, a {@link NoSuchObjectException} will be
* returned. This method throws an <code>IOException</code> for
* other communication failures.
*
* @param call the remote call to execute, produced by an
* <code>OutboundRequestIterator</code> that was returned from
* <code>newCall</code>
*
* @return <code>null</code> on success, or a
* <code>RemoteException</code> if the remote call should fail
* with that <code>RemoteException</code>
*
* @throws IOException if an I/O exception occurs while performing
* this operation
*
* @throws NullPointerException if <code>call</code> is
* <code>null</code>
**/
public RemoteException executeCall(OutboundRequest call)
throws IOException;
}