docs: public static void mergeHandlerChains(PortComponent portComp,
                                            EndpointInfo endpointInfo) {
  
          if (endpointInfo == null || portComp == null) {
              return;
          }
  
          HandlerChainsInfo hChainsInfo = new HandlerChainsInfo();
  
          List<HandlerChain> handlerChains = portComp.getHandlerChains();
  
          if (handlerChains == null || handlerChains.size() == 0) {
              return;
          }
  
          for (HandlerChain hChain : handlerChains) {
  
              HandlerChainInfo chainInfo = new HandlerChainInfo();
  
              // set portQName and serviceQName
              QName qName = convertDDQNameToQName(hChain.getPortNamePattern());
              if (qName != null) {
                  // If endpointInfo's portQName could match the
                  // handlerChain's portName, just ignore the followed
                  // handlers
                  if (!JaxWsUtils.matchesQName(qName, endpointInfo.getWsdlPort(),
                                               true)) {
                      continue;
                  }
                  chainInfo.setPortNamePattern(qName);
              }
  
              qName = convertDDQNameToQName(hChain.getServiceNamePattern());
              if (qName != null) {
                  if (!JaxWsUtils.matchesQName(qName, endpointInfo
                                  .getWsdlService(), true)) {
                      continue;
                  }
                  chainInfo.setServiceNamePattern(qName);
              }
              // set protocol bindings
              List<String> bindings = hChain.getProtocolBindings();
              boolean include = false;
              if (bindings != null) {
                  for (String binding : bindings) {
                      if (JaxWsUtils.singleProtocolMatches(binding, endpointInfo
                                      .getProtocolBinding())) {
                          include |= true;
                      }
                      chainInfo.addProtocolBinding(JaxWsUtils.getProtocolByToken(binding));
                  }
                  // if the binding protocol is not support, just ignore the
                  // handlers
                  if (!include && !bindings.isEmpty()) {
                      continue;
                  }
              }
              // set handlers
              for (Handler handler : hChain.getHandlers()) {
  
                  HandlerInfo hInfo = new HandlerInfo();
  
                  // handler-class
                  String handlerClass = handler.getHandlerClassName();
  
                  if (handlerClass == null || "".equals(handlerClass)) {
                      Tr.warning(tc, "warn.dd.invalid.handler", "<handler-class>", endpointInfo.getPortComponentName());
                      continue;
                  }
  
                  // handler-name
                  String handlerName = handler.getHandlerName();
  
                  if (handlerName == null || "".equals(handlerName)) {
                      Tr.warning(tc, "warn.dd.invalid.handler", "<handler-name>", endpointInfo.getPortComponentName());
                      continue;
                  }
  
                  hInfo.setHandlerClass(handlerClass);
                  hInfo.setHandlerName(handlerName);
  
                  // port-name
                  List<String> portNames = handler.getPortNames();
  
                  for (String portName : portNames) {
                      hInfo.addPortName(portName);
                  }
  
                  // soap-role
                  List<String> soapRoles = handler.getSoapRoles();
  
                  for (String soapRole : soapRoles) {
                      hInfo.addSoapRole(soapRole);
                  }
  
                  // soap-header
                  List<com.ibm.ws.javaee.dd.common.QName> soapHeaders = handler
                                  .getSoapHeaders();
  
                  for (com.ibm.ws.javaee.dd.common.QName soapHeader : soapHeaders) {
                      hInfo.addSoapHeader(new XsdQNameInfo(new QName(
                                                                     soapHeader.getNamespaceURI(), soapHeader
                                                                                     .getLocalPart()), ""));// no id info...
                  }
  
                  // init-param(rpc)
                  List<ParamValue> initParams = handler.getInitParams();
  
                  for (ParamValue pv : initParams) {
                      hInfo.addInitParam(new ParamValueInfo(pv.getName(), pv
                                      .getValue()));
                  }
  
                  chainInfo.addHandlerInfo(hInfo);
              }
  
              hChainsInfo.addHandlerChainInfo(chainInfo);
          }
  
          if (!hChainsInfo.getHandlerChainInfos().isEmpty()) {
              /**
               * According to the behavior of tWAS, just replace the handlerChain
               * from @HandlerChain
               * 
               * site here: 582987 per JSR 109 6.2.2.3, handler chains specified
               * in the dd override handler chain annotations. We can not have
               * both HCannotations and HCtypes set in the dbc, so wipe out the
               * annotations here
               */
              endpointInfo.setHandlerChainsInfo(hChainsInfo);
          }
      }