code: package com.beijunyi.parallelgit.filesystem.utils;
  
  import java.net.URI;
  import java.nio.file.ProviderMismatchException;
  import java.util.*;
  import javax.annotation.Nonnull;
  import javax.annotation.Nullable;
  
  import com.beijunyi.parallelgit.filesystem.GitFileSystemProvider;
  
  public final class GfsUriUtils {
  
    public final static String SID_KEY = "sid";
  
    static void checkScheme(URI uri) throws ProviderMismatchException {
      if(!GitFileSystemProvider.GFS.equalsIgnoreCase(uri.getScheme()))
        throw new ProviderMismatchException(uri.getScheme());
    }
  
    @Nonnull
    public static String getRepository(URI uri) {
      checkScheme(uri);
      String path = uri.getPath();
      if(path.length() > 1 && path.endsWith("/") && !path.endsWith(":/"))
        path = path.substring(0, path.length() - 1);
      return path;
    }
  
    @Nonnull
    public static String getFile(URI uri) throws ProviderMismatchException {
      checkScheme(uri);
      String fragment = uri.getFragment();
      if(fragment == null)
        fragment = "";
      if(!fragment.startsWith("/"))
        fragment = "/" + fragment;
      if(fragment.length() > 1 && fragment.endsWith("/"))
        fragment = fragment.substring(0, fragment.length() - 1);
      return fragment;
    }
  
    @Nonnull
    public static Map<String, String> parseQuery(@Nullable String query, @Nullable Set<String> keys) {
      Map<String, String> params = new HashMap<>();
      if(query != null) {
        String[] pairs = query.split("&");
        int count = 0;
        for(String pair : pairs) {
          String[] keyValue = pair.split("=", 2);
          String key = keyValue[0];
          if(keys == null || keys.contains(key)) {
            params.put(key, keyValue.length > 1 ? keyValue[1] : null);
            if(keys != null && ++count == keys.size())
              break;
          }
        }
      }
      return params;
    }
  
    @Nullable
    public static String getSession(URI uri) throws ProviderMismatchException {
      checkScheme(uri);
      return parseQuery(uri.getQuery(), Collections.singleton(SID_KEY)).get(SID_KEY);
    }
  
  }
  