/*
* 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.rmi.Remote;
import java.rmi.server.ExportException;
import net.jini.core.constraint.MethodConstraints;
import net.jini.security.proxytrust.ProxyTrust;
import net.jini.security.proxytrust.ServerProxyTrust;
/**
* Invocation layer factory for remote objects exported to use Jini
* extensible remote invocation (Jini ERI) that produces proxies that
* additionally implement the {@link ProxyTrust} interface. The remote object
* being exported must be an instance of {@link ServerProxyTrust}, and the
* {@link ProxyTrust#getProxyVerifier ProxyTrust.getProxyVerifier} remote
* method of the proxy is implemented in the invocation dispatcher by
* invoking the {@link ServerProxyTrust#getProxyVerifier
* ServerProxyTrust.getProxyVerifier} local method of the remote object.
*
* @author Sun Microsystems, Inc.
* @since 2.0
* @see net.jini.security.proxytrust.ProxyTrustExporter
*/
public class ProxyTrustILFactory extends BasicILFactory {
/**
* Creates a factory with the specified server constraints, permission
* class, and a <code>null</code> class loader. The server constraints,
* if not <code>null</code>, are used to enforce minimum constraints
* for remote calls. The permission class, if not <code>null</code>, is
* used to perform server-side access control on incoming remote calls.
*
* @param serverConstraints the server constraints, or <code>null</code>
* @param permissionClass the permission class, or <code>null</code>
* @throws IllegalArgumentException if the permission class is abstract, is
* not a subclass of {@link java.security.Permission}, or does not have
* a public constructor that has either one <code>String</code> parameter
* or one {@link java.lang.reflect.Method} parameter and has no declared
* exceptions
**/
public ProxyTrustILFactory(MethodConstraints serverConstraints,
Class permissionClass)
{
this(serverConstraints, permissionClass, null);
}
/**
* Creates a factory with the specified server constraints, permission
* class, and class loader. The server constraints, if not
* <code>null</code>, are used to enforce minimum constraints for
* remote calls. The permission class, if not <code>null</code>, is
* used to perform server-side access control on incoming remote calls.
* The specified loader is passed to the superclass constructor and
* used by the {@link #createInstances createInstances} method.
*
* @param serverConstraints the server constraints, or <code>null</code>
* @param permissionClass the permission class, or <code>null</code>
* @param loader the class loader, or <code>null</code>
* @throws IllegalArgumentException if the permission class is abstract, is
* not a subclass of {@link java.security.Permission}, or does not have
* a public constructor that has either one <code>String</code> parameter
* or one {@link java.lang.reflect.Method} parameter and has no declared
* exceptions
**/
public ProxyTrustILFactory(MethodConstraints serverConstraints,
Class permissionClass,
ClassLoader loader)
{
super(serverConstraints, permissionClass, loader);
}
/**
* Returns a new array containing the remote interfaces that should be
* implemented by the proxy.
*
* <p><code>ProxyTrustILFactory</code> implements this method to return
* an array containing the interfaces obtained by invoking {@link
* BasicILFactory#getRemoteInterfaces super.getRemoteInterfaces}
* passing <code>impl</code> followed by the {@link ProxyTrust}
* interface.
*
* @throws NullPointerException {@inheritDoc}
* @throws ExportException if the remote object is not an instance of
* {@link ServerProxyTrust} or implements any illegal remote interfaces
**/
protected Class[] getRemoteInterfaces(Remote impl) throws ExportException {
if (impl != null && !(impl instanceof ServerProxyTrust)) {
throw new ExportException("impl must implement ServerProxyTrust");
}
Class[] ifs = super.getRemoteInterfaces(impl);
if (ifs == null) {
return new Class[]{ProxyTrust.class};
}
Class[] nifs = new Class[ifs.length + 1];
System.arraycopy(ifs, 0, nifs, 0, ifs.length);
nifs[ifs.length] = ProxyTrust.class;
return nifs;
}
}