package org.jdbi.v3.core.locator.internal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class ClasspathBuilder {
private static final String DOT = ".";
private static final String SLASH = "/";
private final List<String> parts = new ArrayList<>();
private String extension = null;
public ClasspathBuilder setExtension(@Nullable String extension) {
if (extension != null) {
String trimmed = extension.trim();
if (!trimmed.isEmpty()) {
this.extension = trimmed;
}
}
return this;
}
public ClasspathBuilder appendFullyQualifiedClassName(@Nonnull Class clazz) {
return appendDotPath(clazz.getName());
}
public ClasspathBuilder appendDotPath(@Nonnull String path) {
return appendVerbatim(path.replace(DOT, SLASH));
}
public ClasspathBuilder appendVerbatim(@Nonnull String s) {
return addCarefully(s);
}
private ClasspathBuilder addCarefully(@Nullable String part) {
String clean = sanitize(part);
if (clean != null) {
parts.add(clean);
}
return this;
}
public String build() {
if (parts.isEmpty()) {
throw new IllegalStateException("specify path parts before building the path");
}
StringBuilder sb = new StringBuilder();
for (String part : parts) {
sb.append(part).append(SLASH);
}
sb.deleteCharAt(sb.length() - 1);
if (extension != null) {
sb.append(DOT).append(extension);
}
return sb.toString();
}
@Override
public String toString() {
return extension == null
? parts.toString()
: parts.toString() + " + ." + extension;
}
@Nullable
private static String sanitize(String path) {
if (path == null || path.isEmpty() || SLASH.equals(path)) {
return null;
}
String sanitized = Arrays.stream(path.split(Pattern.quote(SLASH)))
.map(String::trim)
.filter(part -> !part.isEmpty())
.collect(Collectors.joining(SLASH));
return sanitized.isEmpty() ? null : sanitized;
}
}