/* * 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.core.constraint; /** * Defines an interface to proxies for setting constraints to control remote * method calls. If a proxy implements this interface, then the semantics of * this interface apply to all calls through all remote methods defined by the * proxy; there is no mechanism to exempt remote methods or remote interfaces * from these semantics. * <p> * Constraints for a remote call come from two sources: * <ul> * <li>Constraints imposed by the server (including any minimum constraints * imposed by the communication mechanism used between the proxy and server) * <li>Constraints placed on a proxy by the client * </ul> * The server constraints are controlled by the proxy implementation; they are * not exposed to the client, and might vary in ways unknown to the client * (for example, vary by method or over time). The client should set the * constraints it wants rather than assuming that the server imposes * particular constraints. Client constraints placed on a proxy apply to all * remote calls made through that particular proxy by any thread, and the * client can specify different constraints for each remote method. * <p> * A remote call will be performed only if the combined requirements (from * both sources) can be satisfied. If the combined requirements cannot be * satisfied, a {@link java.rmi.ConnectIOException} will be thrown by the * remote call, typically containing (but not required to contain) a nested * {@link net.jini.io.UnsupportedConstraintException}. * In addition to the requirements, both client and server preferences will * be satisfied, to the extent possible. * <p> * Note that constraints imposed by the communication mechanism must be * factored into the requirements. For example, if the only explicit * requirement is <code>Delegation.YES</code>, but the communication * mechanism always requires client authentication, then effectively a * <code>ClientAuthentication.YES</code> requirement exists, and so the * <code>Delegation.YES</code> requirement must also be satisfied. * <p> * The constraint mechanisms are designed such that client constraints do not * weaken server constraints, and vice versa. However, it is certainly * possible to specify conflicting constraints. Preferences that conflict * with requirements are ignored, and if preferences conflict with each other * it is arbitrary as to which (if any) are satisfied, but if there are * conflicting requirements the remote call will not be made. * * @author Sun Microsystems, Inc. * @since 2.0 */ public interface RemoteMethodControl { /** * Returns a new copy of this proxy with the client constraints set to the * specified constraints. These constraints completely replace (in the * copy) any client constraints previously placed on this proxy; calling * the {@link #getConstraints getConstraints} method of the copy returns * the identical constraints instance. The original proxy is not modified. * A <code>null</code> value is interpreted as mapping all methods to * empty constraints (one that has no requirements and no preferences). * For any given remote call, the specific client requirements and * preferences to be satisfied are given by the return value of invoking * the {@link MethodConstraints#getConstraints getConstraints} method of * the specified {@link MethodConstraints} instance with a * {@link java.lang.reflect.Method} object representing the remote method. * <p> * Client constraints placed on a proxy are included in the serialized * state of the proxy. This allows third-party services to be transparent * to the client's needs. For example, if remote object <code>s1</code> * obtains a proxy for remote object <code>s2</code>, and passes that * proxy to remote object <code>s3</code>, expecting <code>s3</code> to * invoke a remote method on <code>s2</code>, then <code>s1</code> can * control that call by placing its constraints directly on the proxy * before passing it to <code>s3</code>. If <code>s3</code> does not * wish to be transparent in this way, then it should explicitly replace * the client constraints on received proxies with whatever constraints * are appropriate to implement its own policy. * * @param constraints client constraints, or <code>null</code> * @return a new copy of this proxy with the client constraints set to the * specified constraints * @see #getConstraints */ RemoteMethodControl setConstraints(MethodConstraints constraints); /** * Returns the client constraints placed on this proxy. The return * value can be <code>null</code>, which is interpreted as mapping all * methods to empty constraints (one that has no requirements and no * preferences). * * @return the client constraints, or <code>null</code> * @see #setConstraints */ MethodConstraints getConstraints(); }