/**
   * Locates and loads the bean proxy which is specified in the class from the default context.
   *
   * @param <T> The generic class
   * @param local The class of the interface
   * @return The bean proxy
   * @throws NamingException Any error occurred
   */
  public static <T> T locate(final Class<T> local) throws NamingException {
    PerfTracer tracer = new PerfTracer(TRACER);
    PerfLogger logger = new PerfLogger(LOGGER);
    tracer.entry();

    try {
      String className = local.getName();
      logger.debug("Before " + className + CONSTANT_LOOKUP);
      T instance = (T) new InitialContext().lookup(className);
      logger.debug("After " + className + CONSTANT_LOOKUP);

      return instance;
    } finally {
      tracer.exit();
    }
  }
  /**
   * Locates and loads the bean proxy which is specified in the parameters, the local or the remote
   * proxy will be load, it depends the configuration of this ServiceLocator.
   *
   * @param <T> The generic class
   * @param local The class of the interface
   * @param remote The class of the interface
   * @return The bean proxy
   * @throws NamingException Any error occurred
   */
  public static <T> T locate(final Class<T> local, final Class remote) throws NamingException {
    PerfTracer tracer = new PerfTracer(TRACER);
    PerfLogger logger = new PerfLogger(LOGGER);
    tracer.entry();

    try {
      try {
        return locate(local);
      } catch (Exception except) {
        logger.debug("Local interface not bound: %1$s", except.toString());
      }

      String className = remote.getName();
      logger.debug("Before " + className + CONSTANT_LOOKUP);

      String providerUrl = PROVIDER_URL;
      logger.debug("Default provider URL is %1$s", providerUrl);
      if (System.getProperty("providerUrl." + className) != null) {
        providerUrl = System.getProperty("providerUrl." + className);
        logger.debug("Got %1$s provider URL from property", providerUrl);
      }

      Properties properties = new Properties();
      properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
      properties.put(Context.URL_PKG_PREFIXES, URL_PKG_PREFIXES);
      properties.put(Context.PROVIDER_URL, providerUrl);
      InitialContext ic = new InitialContext(properties);

      T instance = (T) ic.lookup(className);
      logger.debug("After " + className + CONSTANT_LOOKUP);

      return instance;
    } finally {
      tracer.exit();
    }
  }