docs: @Override
      public ServiceDelegate createServiceDelegate(URL url, QName qname,
                                                   @SuppressWarnings("rawtypes") Class cls) {
          Bus bus = null;
          JaxWsClientMetaData clientMetaData = JaxWsMetaDataManager.getJaxWsClientMetaData();
          if (clientMetaData != null) {
              bus = clientMetaData.getClientBus();
          }
          if (bus == null) {
              bus = BusFactory.getThreadDefaultBus();
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "No client  bus is found, the thread context default bus " + bus.getId() + " is used");
              }
          }
  
          WebServiceRefInfo wsrInfo = wsRefInfo.get();
  
          List<WebServiceFeature> serviceFeatures = wsFeatures.get();
          final List<WebServiceFeature> fServiceFeatures = serviceFeatures;
  
          AtomicServiceReference<JaxWsSecurityConfigurationService> secConfigSR = securityConfigSR.get();
          JaxWsSecurityConfigurationService securityConfigService = secConfigSR == null ? null : secConfigSR.getService();
  
          // @TJJ create final vars in order to call a doPriv when creating the LibertyServiceImpl as required by java 2 security
          final JaxWsSecurityConfigurationService scs = securityConfigService;
          final WebServiceRefInfo wi = wsrInfo;
          final Bus b = bus;
          final URL u = url;
          final QName qn = qname;
          final Class c = cls;
          final List<WebServiceFeature> sf = serviceFeatures;
  
          if (serviceFeatures != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Thread context features are configured with " + serviceFeatures);
              }
              LibertyServiceImpl lsl = AccessController.doPrivileged(new PrivilegedAction<LibertyServiceImpl>() {
                  @Override
                  public LibertyServiceImpl run() {
                      return new LibertyServiceImpl(scs, wi, b, u, qn, c, sf.toArray(new WebServiceFeature[sf.size()]));
                  }
              });
              return lsl;
  
          } else {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Thread context features are not set");
              }
  
              LibertyServiceImpl lsl = AccessController.doPrivileged(new PrivilegedAction<LibertyServiceImpl>() {
                  @Override
                  public LibertyServiceImpl run() {
                      return new LibertyServiceImpl(scs, wi, b, u, qn, c);
                  }
              });
              return lsl;
  
          }
      }