@SuppressWarnings("unchecked")
  @Override
  public final Object getObjectInstance(
      Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment) throws Exception {
    final Reference reference = asReference(obj);
    final ServiceNameRefAdr nameAdr = (ServiceNameRefAdr) reference.get("srof");
    if (nameAdr == null) {
      throw new NamingException("Invalid context reference.  Not a 'srof' reference.");
    }
    final ServiceName serviceName = (ServiceName) nameAdr.getContent();
    final ServiceController<?> controller;
    try {
      controller = serviceRegistry.getRequiredService(serviceName);
    } catch (ServiceNotFoundException e) {
      throw new NamingException("Could not resolve service " + serviceName);
    }

    ServiceReferenceListener listener = new ServiceReferenceListener();
    controller.addListener(listener);
    synchronized (listener) {
      // if we are interrupted just let the exception propagate for now
      while (!listener.finished) {
        try {
          listener.wait();
        } catch (InterruptedException e) {
          throw new NamingException(
              "Thread interrupted while retrieving service reference for service " + serviceName);
        }
      }
    }
    switch (listener.getState()) {
      case UP:
        return getObjectInstance(listener.getValue(), obj, name, nameCtx, environment);
      case START_FAILED:
        throw new NamingException(
            "Could not resolve service reference to "
                + serviceName
                + " in factory "
                + getClass().getName()
                + ". Service was in state START_FAILED.");
      case REMOVED:
        throw new NamingException(
            "Could not resolve service reference to "
                + serviceName
                + " in factory "
                + getClass().getName()
                + ". Service was in state START_FAILED.");
    }
    // we should never get here, as the listener should not notify unless the state was one of the
    // above
    throw new NamingException(
        "Could not resolve service reference to "
            + serviceName
            + " in factory "
            + getClass().getName()
            + ". This is a bug in ServiceReferenceObjectFactory. State was"
            + listener.getState());
  }
 /**
  * Returns the name of the resource adapter which will be used as the default RA for MDBs (unless
  * overridden by the MDBs).
  *
  * @param serviceRegistry
  * @return
  */
 private String getDefaultResourceAdapterName(final ServiceRegistry serviceRegistry) {
   if (appclient) {
     // we must report the MDB, but we can't use any MDB/JCA facilities
     return "n/a";
   }
   final ServiceController<DefaultResourceAdapterService> serviceController =
       (ServiceController<DefaultResourceAdapterService>)
           serviceRegistry.getRequiredService(
               DefaultResourceAdapterService.DEFAULT_RA_NAME_SERVICE_NAME);
   return serviceController.getValue().getDefaultResourceAdapterName();
 }