package fitnesse.testsystems; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; public class ClassPath { private static final Logger LOG = Logger.getLogger(ClassPath.class.getName()); private final List<String> elements; private final String separator; public ClassPath(List<String> elements, String separator) { this.elements = elements; this.separator = separator; } public ClassPath(String defaultPath, String pathSeparator) { this(Collections.singletonList(defaultPath), pathSeparator); } public ClassPath(List<ClassPath> paths) { this.elements = new ArrayList<>(); this.separator = paths.get(0).getSeparator(); for (ClassPath path : paths) { for (String element : path.getElements()) { if (!elements.contains(element)) { elements.add(element); } } } } public ClassPath withLocationForClass(String testRunner) { String location = findLocationForClass(testRunner); if (location != null) { List<String> newElements = new ArrayList<>(); newElements.add(location); newElements.addAll(elements); return new ClassPath(newElements, separator); } return this; } public List<String> getElements() { return elements; } public String getSeparator() { return separator; } @Override public String toString() { if (elements.isEmpty()) { return "defaultPath"; } else { return StringUtils.join(elements, separator); } } private String findLocationForClass(String mainClass) { String mainClassFile = mainClass.replaceAll("\\.", "/") + ".class"; URL url = getClass().getClassLoader().getResource(mainClassFile); if (url == null) return null; if ("file".equals(url.getProtocol())) { URI uri = toUri(url); if (uri != null) { String path = uri.getPath(); return new File(path.substring(0, path.length() - mainClassFile.length())).getAbsolutePath(); } } else if ("jar".equals(url.getProtocol())) { String path = url.getPath(); return new File(URI.create(path.substring(0, path.indexOf("!/")))).getAbsolutePath(); } return null; } private URI toUri(URL url) { try { return url.toURI(); } catch (URISyntaxException e) { LOG.log(Level.SEVERE, "Could not convert URL '" + url + "' to URI. Ignoring it for now.", e); return null; } } }