Package com.sun.jini.example.hello

Source Code of com.sun.jini.example.hello.Client$ProxyPreparerFilter

/*
* 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 com.sun.jini.example.hello;

import java.rmi.RemoteException;
import java.security.PrivilegedExceptionAction;
import javax.security.auth.Subject;
import javax.security.auth.login.LoginContext;
import net.jini.config.Configuration;
import net.jini.config.ConfigurationProvider;
import net.jini.config.NoSuchEntryException;
import net.jini.core.lookup.ServiceItem;
import net.jini.core.lookup.ServiceTemplate;
import net.jini.discovery.LookupDiscovery;
import net.jini.lookup.ServiceDiscoveryManager;
import net.jini.lookup.ServiceItemFilter;
import net.jini.security.BasicProxyPreparer;
import net.jini.security.ProxyPreparer;

/**
* Defines an application that makes calls to a remote Hello server.
*
* The application uses the following arguments:
*
* [all] - All arguments are used as options when getting the configuration
*
* The application uses the following configuration entries, with component
* com.sun.jini.example.hello.Client:
*
* loginContext
*   type: LoginContext
*   default: null
*   If non-null, specifies the JAAS login context to use for performing a JAAS
*   login and supplying the Subject to use when running the client. If null,
*   no JAAS login is performed.
*
* preparer
*   type: ProxyPreparer
*   default: new BasicProxyPreparer()
*   Proxy preparer for the server proxy
*
* serviceDiscovery
*   type: ServiceDiscoveryManager
*   default: new ServiceDiscoveryManager(
*                new LookupDiscovery(new String[] { "" }, config),
*                null, config)
*   Object used for discovering a server that implement Hello.
*
* @author Sun Microsystems, Inc.
*/
public class Client {

    /**
     * Starts an application that makes calls to a remote Hello implementation.
     */
    public static void main(String[] args) throws Exception {
  /*
   * The configuration contains information about constraints to apply to
   * the server proxy.
   */
  final Configuration config = ConfigurationProvider.getInstance(args);
  LoginContext loginContext = (LoginContext) config.getEntry(
      "com.sun.jini.example.hello.Client", "loginContext",
      LoginContext.class, null);
  if (loginContext == null) {
      mainAsSubject(config);
  } else {
      loginContext.login();
      Subject.doAsPrivileged(
    loginContext.getSubject(),
    new PrivilegedExceptionAction() {
        public Object run() throws Exception {
      mainAsSubject(config);
      return null;
        }
    },
    null);
  }
    }

    /**
     * Performs the main operations of the application with the specified
     * configuration and assuming that the appropriate subject is in effect.
     */
    static void mainAsSubject(Configuration config) throws Exception {

  /* Get the service discovery manager, for discovering other services */
  ServiceDiscoveryManager serviceDiscovery;
  try {
      serviceDiscovery = (ServiceDiscoveryManager) config.getEntry(
    "com.sun.jini.example.hello.Client", "serviceDiscovery",
    ServiceDiscoveryManager.class);
  } catch (NoSuchEntryException e) {
      /* Default to search in the public group */
      serviceDiscovery = new ServiceDiscoveryManager(
    new LookupDiscovery(new String[] { "" }, config),
    null, config);
  }

        /* Retrieve the server proxy preparer from the configuration */
  ProxyPreparer preparer = (ProxyPreparer) config.getEntry(
      "com.sun.jini.example.hello.Client",
      "preparer", ProxyPreparer.class, new BasicProxyPreparer());

        /* Create the filter to pass to the SDM for proxy preparation */
        ServiceItemFilter filter = new ProxyPreparerFilter(preparer);

  /* Look up the remote server (SDM performs proxy preparation) */
  ServiceItem serviceItem = serviceDiscovery.lookup(
      new ServiceTemplate(null, new Class[] { Hello.class }, null),
      filter, Long.MAX_VALUE);
  Hello server = (Hello) serviceItem.service;

  /* Use the server */
  System.out.println("Server says: " + server.sayHello());

  /* Exit to close any thread created by the callback handler's GUI */
  System.exit(0);
    }

    /** Performs proxy preparation on discovered services. For more information
     *  see the javadoc for the net.jini.lookup.ServiceItemFilter interface.
     */
    private static class ProxyPreparerFilter implements ServiceItemFilter {
        private ProxyPreparer preparer;

        ProxyPreparerFilter(ProxyPreparer preparer) {
            this. preparer = preparer;
        }

        /** See the javadoc for the ServiceItemFilter.check method. */
  public boolean check(ServiceItem item) {
            try {
                item.service = preparer.prepareProxy(item.service);
                return true//pass
            } catch(SecurityException e) {//definite exception
                return false; //fail: don't try again
            } catch(RemoteException e) {//indefinite exception
                item.service = null;
                return true//null & true == indefinite: will retry later
            }
  }
    }
}
TOP

Related Classes of com.sun.jini.example.hello.Client$ProxyPreparerFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.