package com.beijunyi.parallelgit.filesystem.utils;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import com.beijunyi.parallelgit.filesystem.GitFileSystem;
import com.beijunyi.parallelgit.filesystem.GitFileSystemProvider;
import com.beijunyi.parallelgit.filesystem.GitPath;
import org.eclipse.jgit.lib.Repository;
public class GfsUriBuilder {
private String repository;
private String file;
private final Map<String, String> params = new LinkedHashMap<>();
@Nonnull
public static GfsUriBuilder prepare() {
return new GfsUriBuilder();
}
@Nonnull
public static GfsUriBuilder fromFileSystem(GitFileSystem gfs) {
return prepare()
.repository(gfs.getRepository())
.sid(gfs.getSessionId());
}
@Nonnull
public GfsUriBuilder sid(@Nullable String session) {
if(session != null)
params.put(GfsUriUtils.SID_KEY, session);
else
params.remove(GfsUriUtils.SID_KEY);
return this;
}
@Nonnull
public GfsUriBuilder repository(@Nullable String repoDirPath) {
this.repository = repoDirPath;
return this;
}
@Nonnull
public GfsUriBuilder repository(@Nullable File repoDir) {
return repository(repoDir != null ? repoDir.toURI().getPath() : null);
}
@Nonnull
public GfsUriBuilder repository(@Nullable Repository repository) {
return repository(repository != null
? (repository.isBare() ? repository.getDirectory() : repository.getWorkTree())
: null);
}
@Nonnull
public GfsUriBuilder file(@Nullable String filePathStr) {
this.file = filePathStr;
return this;
}
@Nonnull
public GfsUriBuilder file(@Nullable GitPath filePath) {
return file(filePath != null ? filePath.toRealPath().toString() : null);
}
@Nonnull
private String buildPath() {
if(repository == null)
throw new IllegalArgumentException("Missing repository");
if(!repository.startsWith("/"))
throw new IllegalArgumentException("Repository location must be an absolute path");
return repository;
}
@Nullable
private String buildQuery() {
if(params.isEmpty()) return null;
StringBuilder query = new StringBuilder();
for(Map.Entry<String, String> param : params.entrySet()) {
if(query.length() > 0) query.append('&');
query.append(param.getKey()).append('=').append(param.getValue());
}
return query.toString();
}
@Nullable
private String buildFragment() {
if(file == null || file.isEmpty() || file.equals("/"))
return null;
String fragment = "";
if(!file.startsWith("/"))
fragment += "/";
fragment += file;
return fragment;
}
@Nonnull
public URI build() {
try {
return new URI(GitFileSystemProvider.GFS, null, buildPath(), buildQuery(), buildFragment());
} catch(URISyntaxException e) {
throw new IllegalStateException(e);
}
}
}