docs: @Override
    public ServiceCreationConfiguration<ClusteringService> parseServiceCreationConfiguration(final Element fragment, ClassLoader classLoader) {
  
      if ("cluster".equals(fragment.getLocalName())) {
  
        ClusteringCacheManagerServiceConfigurationParser.ServerSideConfig serverConfig = null;
        URI connectionUri = null;
        List<InetSocketAddress> serverAddresses = new ArrayList<>();
        String clusterTierManager = null;
        Duration getTimeout = null, putTimeout = null, connectionTimeout = null;
        final NodeList childNodes = fragment.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
          final Node item = childNodes.item(i);
          if (Node.ELEMENT_NODE == item.getNodeType()) {
            switch (item.getLocalName()) {
              case "connection":
                /*
                 * <connection> is a required element in the XSD
                 */
                final Attr urlAttribute = ((Element)item).getAttributeNode("url");
                final String urlValue = urlAttribute.getValue();
                try {
                  connectionUri = new URI(urlValue);
                } catch (URISyntaxException e) {
                  throw new XmlConfigurationException(
                    String.format("Value of %s attribute on XML configuration element <%s> in <%s> is not a valid URI - '%s'",
                      urlAttribute.getName(), item.getNodeName(), fragment.getTagName(), connectionUri), e);
                }
  
                break;
              case "cluster-connection":
                clusterTierManager = ((Element)item).getAttribute("cluster-tier-manager");
                final NodeList serverNodes = item.getChildNodes();
                for (int j = 0; j < serverNodes.getLength(); j++) {
                  final Node serverNode = serverNodes.item(j);
                  final String host = ((Element)serverNode).getAttributeNode("host").getValue();
                  final Attr port = ((Element)serverNode).getAttributeNode("port");
                  InetSocketAddress address;
                  if (port == null) {
                    address = InetSocketAddress.createUnresolved(host, 0);
                  } else {
                    String portString = port.getValue();
                    address = InetSocketAddress.createUnresolved(host, Integer.parseInt(portString));
                  }
                  serverAddresses.add(address);
                }
  
                break;
              case "read-timeout":
                /*
                 * <read-timeout> is an optional element
                 */
                getTimeout = processTimeout(fragment, item);
  
                break;
              case "write-timeout":
                /*
                 * <write-timeout> is an optional element
                 */
                putTimeout = processTimeout(fragment, item);
  
                break;
              case "connection-timeout":
                /*
                 * <connection-timeout> is an optional element
                 */
                connectionTimeout = processTimeout(fragment, item);
  
                break;
              case "server-side-config":
                /*
                 * <server-side-config> is an optional element
                 */
                serverConfig = processServerSideConfig(item);
                break;
              default:
                throw new XmlConfigurationException(
                  String.format("Unknown XML configuration element <%s> in <%s>",
                    item.getNodeName(), fragment.getTagName()));
            }
          }
        }
  
        try {
          Timeouts timeouts = getTimeouts(getTimeout, putTimeout, connectionTimeout);
          if (serverConfig == null) {
            if (connectionUri != null) {
              return new ClusteringServiceConfiguration(connectionUri, timeouts);
            } else {
              return new ClusteringServiceConfiguration(serverAddresses, clusterTierManager, timeouts);
            }
          }
  
          ServerSideConfiguration serverSideConfiguration;
          if (serverConfig.defaultServerResource == null) {
            serverSideConfiguration = new ServerSideConfiguration(serverConfig.pools);
          } else {
            serverSideConfiguration = new ServerSideConfiguration(serverConfig.defaultServerResource, serverConfig.pools);
          }
  
          if (connectionUri != null) {
            return new ClusteringServiceConfiguration(connectionUri, timeouts, serverConfig.autoCreate, serverSideConfiguration);
          } else {
            return new ClusteringServiceConfiguration(serverAddresses, clusterTierManager, timeouts, serverConfig.autoCreate, serverSideConfiguration);
          }
        } catch (IllegalArgumentException e) {
          throw new XmlConfigurationException(e);
        }
      }
      throw new XmlConfigurationException(String.format("XML configuration element <%s> in <%s> is not supported",
        fragment.getTagName(), (fragment.getParentNode() == null ? "null" : fragment.getParentNode().getLocalName())));
    }