@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(); }