public static boolean containsAPathingJar(String sequence) { for(String token : sequence.split(File.pathSeparator)) { if(isPathingJar(token)) { return true; } } return false; }
public static String expandPathingJars(String sequence) { List<String> list = new ArrayList<>(); for(String token : sequence.split(File.pathSeparator)) { if(isPathingJar(token)) { list.add(extractCPFromPathingJar(token)); } else { list.add(token); } } return String.join(File.pathSeparator, list); }
public static String extractCPFromPathingJar(String pathingJar) throws IllegalArgumentException{ Inputs.checkNull(pathingJar); if(!isPathingJar(pathingJar)) { throw new IllegalArgumentException("Invalid pathing jar name: "+pathingJar); } File jar = new File(pathingJar); if(!jar.exists()) { throw new IllegalArgumentException("Pathing jar does not exist: "+pathingJar); } try (JarInputStream in = new JarInputStream(new FileInputStream(jar))) { Manifest m = in.getManifest(); String escapedCP = m.getMainAttributes().getValue(Attributes.Name.CLASS_PATH); List<String> list = new ArrayList<>(); for(String token : escapedCP.split(" ")) { File file = new File(token.replace("%20"," ")); if(!file.exists()) { //this should never happen, unless bug in EvoSuite throw new IllegalStateException("Pathing jar "+pathingJar+" refers to non-existing entry " + token); } if(isPathingJar(file.getAbsolutePath())) { throw new IllegalArgumentException("Pathing jar "+pathingJar+" contains the pathing jar "+file.getAbsolutePath()); } list.add(file.getAbsolutePath()); } return String.join(File.pathSeparator, list); } catch (IOException e) { logger.error(e.toString(),e); return pathingJar; } }
private static String findEvoSuiteMainJar(String path){ if(isEvoSuiteMainJar(path)){ return path; } if(JarPathing.isPathingJar(path)){ for(String subpath : JarPathing.extractCPFromPathingJar(path).split(File.pathSeparator)){ if(isEvoSuiteMainJar(subpath)){ return subpath; } } } return null; }
if(isPathingJar(element)) { elements.addAll(Arrays.asList(extractCPFromPathingJar(element).split(File.pathSeparator))); continue;
@Test public void testBase(){ String first = "target"+File.separator+"classes"; String second = "target"+File.separator+"test-classes"; String classpath = first + File.pathSeparator + second; assertFalse(JarPathing.containsAPathingJar(classpath)); String pathing = JarPathing.createJarPathing(classpath); assertTrue(JarPathing.isPathingJar(pathing)); String back = JarPathing.extractCPFromPathingJar(pathing); assertTrue(back.contains(first)); assertTrue(back.contains(second)); }