private Registry readDefaultConfiguration() {
    // if it contains some old configuration, remove it (Archiva 0.9)
    registry.removeSubset(KEY);

    try {
      registry.addConfigurationFromResource(
          "org/apache/archiva/configuration/default-archiva.xml", KEY);
      this.isConfigurationDefaulted = true;
    } catch (RegistryException e) {
      throw new ConfigurationRuntimeException(
          "Fatal error: Unable to find the built-in default configuration and load it into the registry",
          e);
    }
    return registry.getSubset(KEY);
  }
  @SuppressWarnings("unchecked")
  private Configuration load() {
    // TODO: should this be the same as section? make sure unnamed sections still work (eg, sys
    // properties)
    Registry subset = registry.getSubset(KEY);
    if (subset.getString("version") == null) {
      // a little autodetection of v1, even if version is omitted (this was previously allowed)
      if (subset.getSubset("repositoryScanning").isEmpty()) {
        // only for empty, or v < 1
        subset = readDefaultConfiguration();
      }
    }

    Configuration config = new ConfigurationRegistryReader().read(subset);

    config.getRepositoryGroups();
    config.getRepositoryGroupsAsMap();
    if (!config.getRepositories().isEmpty()) {
      for (V1RepositoryConfiguration r : config.getRepositories()) {
        r.setScanned(r.isIndexed());

        if (StringUtils.startsWith(r.getUrl(), "file://")) {
          r.setLocation(r.getUrl().substring(7));
          config.addManagedRepository(r);
        } else if (StringUtils.startsWith(r.getUrl(), "file:")) {
          r.setLocation(r.getUrl().substring(5));
          config.addManagedRepository(r);
        } else if (StringUtils.isEmpty(r.getUrl())) {
          // in case of empty url we can consider it as a managed one
          // check if location is null
          // file://${appserver.base}/repositories/${id}
          if (StringUtils.isEmpty(r.getLocation())) {
            r.setLocation("file://${appserver.base}/repositories/" + r.getId());
          }
          config.addManagedRepository(r);
        } else {
          RemoteRepositoryConfiguration repo = new RemoteRepositoryConfiguration();
          repo.setId(r.getId());
          repo.setLayout(r.getLayout());
          repo.setName(r.getName());
          repo.setUrl(r.getUrl());
          config.addRemoteRepository(repo);
        }
      }

      // Prevent duplicate repositories from showing up.
      config.getRepositories().clear();

      registry.removeSubset(KEY + ".repositories");
    }

    if (!CollectionUtils.isEmpty(config.getRemoteRepositories())) {
      List<RemoteRepositoryConfiguration> remoteRepos = config.getRemoteRepositories();
      for (RemoteRepositoryConfiguration repo : remoteRepos) {
        // [MRM-582] Remote Repositories with empty <username> and <password> fields shouldn't be
        // created in configuration.
        if (StringUtils.isBlank(repo.getUsername())) {
          repo.setUsername(null);
        }

        if (StringUtils.isBlank(repo.getPassword())) {
          repo.setPassword(null);
        }
      }
    }

    if (!config.getProxyConnectors().isEmpty()) {
      // Fix Proxy Connector Settings.

      // Create a copy of the list to read from (to prevent concurrent modification exceptions)
      List<ProxyConnectorConfiguration> proxyConnectorList =
          new ArrayList<>(config.getProxyConnectors());
      // Remove the old connector list.
      config.getProxyConnectors().clear();

      for (ProxyConnectorConfiguration connector : proxyConnectorList) {
        // Fix policies
        boolean connectorValid = true;

        Map<String, String> policies = new HashMap<>();
        // Make copy of policies
        policies.putAll(connector.getPolicies());
        // Clear out policies
        connector.getPolicies().clear();

        // Work thru policies. cleaning them up.
        for (Entry<String, String> entry : policies.entrySet()) {
          String policyId = entry.getKey();
          String setting = entry.getValue();

          // Upgrade old policy settings.
          if ("releases".equals(policyId) || "snapshots".equals(policyId)) {
            if ("ignored".equals(setting)) {
              setting = AbstractUpdatePolicy.ALWAYS;
            } else if ("disabled".equals(setting)) {
              setting = AbstractUpdatePolicy.NEVER;
            }
          } else if ("cache-failures".equals(policyId)) {
            if ("ignored".equals(setting)) {
              setting = CachedFailuresPolicy.NO;
            } else if ("cached".equals(setting)) {
              setting = CachedFailuresPolicy.YES;
            }
          } else if ("checksum".equals(policyId)) {
            if ("ignored".equals(setting)) {
              setting = ChecksumPolicy.IGNORE;
            }
          }

          // Validate existance of policy key.
          if (policyExists(policyId)) {
            Policy policy = findPolicy(policyId);
            // Does option exist?
            if (!policy.getOptions().contains(setting)) {
              setting = policy.getDefaultOption();
            }
            connector.addPolicy(policyId, setting);
          } else {
            // Policy key doesn't exist. Don't add it to golden version.
            log.warn("Policy [{}] does not exist.", policyId);
          }
        }

        if (connectorValid) {
          config.addProxyConnector(connector);
        }
      }

      // Normalize the order fields in the proxy connectors.
      Map<String, java.util.List<ProxyConnectorConfiguration>> proxyConnectorMap =
          config.getProxyConnectorAsMap();

      for (List<ProxyConnectorConfiguration> connectors : proxyConnectorMap.values()) {
        // Sort connectors by order field.
        Collections.sort(connectors, ProxyConnectorConfigurationOrderComparator.getInstance());

        // Normalize the order field values.
        int order = 1;
        for (ProxyConnectorConfiguration connector : connectors) {
          connector.setOrder(order++);
        }
      }
    }

    return config;
  }