/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed 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.
 */

import net.jini.core.entry.Entry;
import net.jini.jeri.BasicILFactory;
import net.jini.jeri.BasicJeriExporter;
import net.jini.jeri.tcp.TcpServerEndpoint;
import net.jini.lookup.entry.Name;
import java.security.Permission;
import net.jini.constraint.BasicMethodConstraints;
import net.jini.core.constraint.InvocationConstraints;
import net.jini.security.BasicProxyPreparer;


com.sun.jini.outrigger{

    serviceInvocationConstraints=InvocationConstraints.EMPTY;

    name = "Java Space (Outrigger)";

    initialLookupAttributes=new Entry[]{	new Name(name)};

    initialLookupGroups=new String[] {$discoveryGroup};

    serverExporter= new BasicJeriExporter(TcpServerEndpoint.getInstance(0),
                                 new BasicILFactory());
    basicProxyPreparer =
        new BasicProxyPreparer(false, new BasicMethodConstraints(serviceInvocationConstraints),
        new Permission[] { new RuntimePermission("accessClassInPackage.com.sun.proxy") } );

    transactionManagerPreparer=basicProxyPreparer;
    listenerPreparer=basicProxyPreparer;

}


net.jini.lookup.JoinManager {
    serviceInvocationConstraints=InvocationConstraints.EMPTY;
        
    basicProxyPreparer =
        new BasicProxyPreparer(false, new BasicMethodConstraints(serviceInvocationConstraints),
            new Permission[] { new RuntimePermission("accessClassInPackage.com.sun.proxy") } );

    registrarPreparer = basicProxyPreparer;
    registrationPreparer = basicProxyPreparer;
    serviceLeasePreparer = basicProxyPreparer;
    
}