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);
}
}