docs: @Override
      @FFDCIgnore(TimeoutException.class)
      public Future<Boolean> startModule(ExtendedModuleInfo moduleInfo) throws StateChangeException {
          final boolean trace = TraceComponent.isAnyTracingEnabled();
          ConnectorModuleMetaDataImpl metadataImpl = (ConnectorModuleMetaDataImpl) moduleInfo.getMetaData();
          String id = metadataImpl.getIdentifier();
          ResourceAdapterMetaData raMetaData = (ResourceAdapterMetaData) metadataImpl.getComponentMetaDatas()[0];
  
          Container container = moduleInfo.getContainer();
          ConnectorModuleMetatype cmmt;
          try {
              cmmt = container.adapt(ConnectorModuleMetatype.class);
          } catch (UnableToAdaptException e) {
              throw new StateChangeException(e);
          }
  
          try {
              metaDataService.fireComponentMetaDataCreated(raMetaData);
          } catch (MetaDataException mde) {
              throw new StateChangeException(mde);
          }
  
          try {
              cmmt.generateMetatype();
          } catch (Exception x) {
              if (x instanceof StateChangeException)
                  throw (StateChangeException) x;
              throw new StateChangeException(x);
          }
  
          moduleMetatype.put(id.toUpperCase(), cmmt);
  
          String bootstrapContextFactoryPid = cmmt.getBootstrapContextFactoryPid();
  
          // TEMP begin
          // It's important that the service listeners be registered before the metatype provider, otherwise we could miss some events
          RARInstallListener rarInstallListener;
          try {
              rarInstallListener = new RARInstallListener(id, bootstrapContextFactoryPid, cmmt.getAutoStart());
          } catch (Throwable x) {
              throw new StateChangeException(x);
          }
          // TEMP end
  
          try {
              cmmt.registerMetatype();
          } catch (Exception x) {
              throw new StateChangeException(x);
          }
  
          // TEMP begin
          while (!FrameworkState.isStopping()) {
              try {
                  if (rarInstallListener.latch.await(1000, TimeUnit.MILLISECONDS)) {
                      if (trace && tc.isEventEnabled())
                          Tr.event(tc, "[" + id + "] BootstrapContext CountDownLatch complete");
                      break;
                  }
                  if (trace && tc.isDebugEnabled())
                      Tr.debug(this, tc, "[" + id + "] BootstrapContext service event has not arrived");
              } catch (InterruptedException x) {
                  x.getCause();
              }
          }
  
          if (!FrameworkState.isStopping())
              try {
                  rarInstallListener.future.get(metadataImpl.getMaxWaitForResources(), TimeUnit.MILLISECONDS);
              } catch (InterruptedException x) {
                  futureMonitor.setResult(rarInstallListener.future, x);
              } catch (ExecutionException x) {
                  throw new StateChangeException(x);
              } catch (TimeoutException x) {
                  // Only consider this a failure if the bootstrap context singleton is missing.
                  // Otherwise, it is due to one or more invalidly configured resource instance(s).
                  if (trace && tc.isEventEnabled())
                      synchronized (rarInstallListener) {
                          Tr.event(tc, "[" + id + "] Timed out waiting for configured resource instances to be registered. Configured/Registered:",
                                   rarInstallListener.instancesConfigured, rarInstallListener.instancesRegistered);
                      }
  
                  try {
                      Collection<ServiceReference<BootstrapContext>> refs;
                      lock.readLock().lock();
                      try {
                          refs = bundleContext == null ? null : Utils.priv.getServiceReferences(bundleContext, BootstrapContext.class, "(id=" + id + ')');
                      } finally {
                          lock.readLock().unlock();
                      }
                      if (refs == null || refs.isEmpty()) {
                          FFDCFilter.processException(x, getClass().getName(), "420", this, new Object[] { id, bootstrapContextFactoryPid });
                          futureMonitor.setResult(rarInstallListener.future, x);
                      } else
                          futureMonitor.setResult(rarInstallListener.future, true);
                  } catch (InvalidSyntaxException e) {
                      futureMonitor.setResult(rarInstallListener.future, e);
                  }
              } finally {
                  removeServiceListeners(id);
              }
          // TEMP end
  
          return rarInstallListener.future;
      }