/** * * Filters a list of classpath resources, selecting only class files. * * @param classpathResources - a list of classpath resources * @return - the filtered list containing only class files, or an empty list if no matches found */ public static final List<ClasspathResource> filterClassFilesOnly(List<ClasspathResource> classpathResources) { if (classpathResources == null) { throw new IllegalArgumentException("Classpath resources cannot be null."); } List<ClasspathResource> filtered = new ArrayList<>(); for (ClasspathResource classpathResource : classpathResources) { String resourceName = classpathResource.getName(); if (resourceName != null && resourceName.endsWith(".class")) { filtered.add(classpathResource); } } return filtered; }
@Override public int compare(ClasspathResource resource1, ClasspathResource resource2) { return -1 * new Integer(resource1.getResourceFileVersions().size()).compareTo(resource2.getResourceFileVersions().size()); } };
/** * Inspects a given list of classpath resources, and returns only the resources that contain multiple versions. * * @param resourceFiles - the resource files to be inspected * @param excludeSameSizeDups - true to consider only as duplicates files with multiple versions with different file * sizes * @return - the list of resources with duplicates */ public static List<ClasspathResource> findResourcesWithDuplicates(List<ClasspathResource> resourceFiles, boolean excludeSameSizeDups) { List<ClasspathResource> resourcesWithDuplicates = new ArrayList<>(); // keep only entries with duplicates for (ClasspathResource resource : resourceFiles) { if (resource.hasDuplicates(excludeSameSizeDups)) { resourcesWithDuplicates.add(resource); } } return resourcesWithDuplicates; } }
public JHades findClass(Class clazz) { if (clazz == null) { throw new IllegalArgumentException("Class name cannot be null."); } System.out.println(">> jHades searchClass >> Searching for class: " + clazz.getCanonicalName() + "\n"); ClasspathResource foundClass = scanner.findClass(clazz); for (ClasspathResourceVersion version : foundClass.getResourceFileVersions()) { System.out.println(version.getClasspathEntry().getUrl() + foundClass.getName() + " size = " + version.getFileSize()); } endCommand(foundClass != null); return this; }
String resourceName = resourceVersion.getResourceName(); if (!resourcesPerNameMap.containsKey(resourceName)) { resourcesPerNameMap.put(resourceName, new ClasspathResource(resourceName, resourceVersion)); } else { resourcesPerNameMap.get(resourceName).getResourceFileVersions().add(resourceVersion);
public JHades findClass(Class clazz) { if (clazz == null) { throw new IllegalArgumentException("Class name cannot be null."); } System.out.println(">> jHades searchClass >> Searching for class: " + clazz.getCanonicalName() + "\n"); ClasspathResource foundClass = scanner.findClass(clazz); for (ClasspathResourceVersion version : foundClass.getResourceFileVersions()) { System.out.println(version.getClasspathEntry().getUrl() + foundClass.getName() + " size = " + version.getFileSize()); } endCommand(foundClass != null); return this; }
String resourceName = resourceVersion.getResourceName(); if (!resourcesPerNameMap.containsKey(resourceName)) { resourcesPerNameMap.put(resourceName, new ClasspathResource(resourceName, resourceVersion)); } else { resourcesPerNameMap.get(resourceName).getResourceFileVersions().add(resourceVersion);
public void print() { System.out.println("\n>> jHades multipleClassVersionsReport >> Duplicate classpath resources report: \n"); ClasspathResources.sortByNumberOfVersionsDesc(resourcesWithDuplicates); for (ClasspathResource resource : resourcesWithDuplicates) { if (!resourcesToExclude.contains(resource.getName())) { System.out.println(resource.getName() + " has " + resource.getResourceFileVersions().size() + " versions on these classpath locations:\n"); for (ClasspathResourceVersion resourceFileVersion : resource.getResourceFileVersions()) { String classLoaderName = resourceFileVersion.getClasspathEntry().getClassLoaderName(); System.out.println(" " + (classLoaderName != null ? classLoaderName : "") + " - " + urlFormatter.formatUrl(resourceFileVersion.getClasspathEntry().getUrl()) + " - class file size = " + resourceFileVersion.getFileSize()); } System.out.println(); } } if (resourcesWithDuplicates.isEmpty()) { System.out.println("No duplicates where found.\n"); } } }
/** * * Search for a given class on the classpath, returns the list of all class versions. * * @param clazz - the class being searched. * @return - the classpath resource containing all the class versions, or null if not found */ public ClasspathResource findClass(Class clazz) { String classResourceName = clazz.getName().replace(".", "/") + ".class"; List<ClasspathResource> allResources = findAllClasspathResources(); ClasspathResource foundResource = null; for (ClasspathResource resource : allResources) { if (resource != null && resource.getName() != null && resource.getName().endsWith(classResourceName)) { foundResource = resource; break; } } return foundResource; }
@Override public int compare(ClasspathResource resource1, ClasspathResource resource2) { return -1 * new Integer(resource1.getResourceFileVersions().size()).compareTo(resource2.getResourceFileVersions().size()); } };
/** * Inspects a given list of classpath resources, and returns only the resources that contain multiple versions. * * @param resourceFiles - the resource files to be inspected * @param excludeSameSizeDups - true to consider only as duplicates files with multiple versions with different file * sizes * @return - the list of resources with duplicates */ public static List<ClasspathResource> findResourcesWithDuplicates(List<ClasspathResource> resourceFiles, boolean excludeSameSizeDups) { List<ClasspathResource> resourcesWithDuplicates = new ArrayList<>(); // keep only entries with duplicates for (ClasspathResource resource : resourceFiles) { if (resource.hasDuplicates(excludeSameSizeDups)) { resourcesWithDuplicates.add(resource); } } return resourcesWithDuplicates; } }
public void print() { System.out.println("\n>> jHades multipleClassVersionsReport >> Duplicate classpath resources report: \n"); ClasspathResources.sortByNumberOfVersionsDesc(resourcesWithDuplicates); for (ClasspathResource resource : resourcesWithDuplicates) { if (!resourcesToExclude.contains(resource.getName())) { System.out.println(resource.getName() + " has " + resource.getResourceFileVersions().size() + " versions on these classpath locations:\n"); for (ClasspathResourceVersion resourceFileVersion : resource.getResourceFileVersions()) { String classLoaderName = resourceFileVersion.getClasspathEntry().getClassLoaderName(); System.out.println(" " + (classLoaderName != null ? classLoaderName : "") + " - " + urlFormatter.formatUrl(resourceFileVersion.getClasspathEntry().getUrl()) + " - class file size = " + resourceFileVersion.getFileSize()); } System.out.println(); } } if (resourcesWithDuplicates.isEmpty()) { System.out.println("No duplicates where found.\n"); } } }
/** * * Filters a list of classpath resources, selecting only class files. * * @param classpathResources - a list of classpath resources * @return - the filtered list containing only class files, or an empty list if no matches found */ public static final List<ClasspathResource> filterClassFilesOnly(List<ClasspathResource> classpathResources) { if (classpathResources == null) { throw new IllegalArgumentException("Classpath resources cannot be null."); } List<ClasspathResource> filtered = new ArrayList<>(); for (ClasspathResource classpathResource : classpathResources) { String resourceName = classpathResource.getName(); if (resourceName != null && resourceName.endsWith(".class")) { filtered.add(classpathResource); } } return filtered; }
/** * * @return - a list of jar pairs that have overlapping class files - only a limited list of classpath resources is * considered. * */ public List<JarPair> findOverlappingJars(List<ClasspathResource> classpathResources, boolean excludeSameSizeDups) { List<ClasspathResource> classFilesWithDuplicates = findClassFileDuplicates(classpathResources, excludeSameSizeDups); //jar overlap report Map<JarPair, JarPair> overlapPairs = new HashMap<>(); for (ClasspathResource classFile : classFilesWithDuplicates) { List<ClasspathResourceVersion> versions = classFile.getResourceFileVersions(); findOverlappingJarsPairs(versions, overlapPairs, 0); } List<JarPair> overlapReportLines = new ArrayList<>(overlapPairs.keySet()); Comparator<JarPair> comparator = new Comparator<JarPair>() { @Override public int compare(JarPair line1, JarPair line2) { return -1 * line1.getDupClassesTotal().compareTo(line2.getDupClassesTotal()); } }; Collections.sort(overlapReportLines, comparator); return overlapReportLines; }
System.out.println("\nSearch results using regular expression: " + searchByFileName + "\n"); for (ClasspathResource match : searchResults) { System.out.println(match.getName() + "\n"); for (ClasspathResourceVersion version : match.getResourceFileVersions()) { System.out.println(" " + version.getClasspathEntry().getUrl());
/** * * Search for a given class on the classpath, returns the list of all class versions. * * @param clazz - the class being searched. * @return - the classpath resource containing all the class versions, or null if not found */ public ClasspathResource findClass(Class clazz) { String classResourceName = clazz.getName().replace(".", "/") + ".class"; List<ClasspathResource> allResources = findAllClasspathResources(); ClasspathResource foundResource = null; for (ClasspathResource resource : allResources) { if (resource != null && resource.getName() != null && resource.getName().endsWith(classResourceName)) { foundResource = resource; break; } } return foundResource; }
/** * * @return - a list of jar pairs that have overlapping class files - only a limited list of classpath resources is * considered. * */ public List<JarPair> findOverlappingJars(List<ClasspathResource> classpathResources, boolean excludeSameSizeDups) { List<ClasspathResource> classFilesWithDuplicates = findClassFileDuplicates(classpathResources, excludeSameSizeDups); //jar overlap report Map<JarPair, JarPair> overlapPairs = new HashMap<>(); for (ClasspathResource classFile : classFilesWithDuplicates) { List<ClasspathResourceVersion> versions = classFile.getResourceFileVersions(); findOverlappingJarsPairs(versions, overlapPairs, 0); } List<JarPair> overlapReportLines = new ArrayList<>(overlapPairs.keySet()); Comparator<JarPair> comparator = new Comparator<JarPair>() { @Override public int compare(JarPair line1, JarPair line2) { return -1 * line1.getDupClassesTotal().compareTo(line2.getDupClassesTotal()); } }; Collections.sort(overlapReportLines, comparator); return overlapReportLines; }
/** * * finds a resource on the classpath using a regular expression. * * @param search - search regular expression * @return - the list of classpath resources that match the regular expression */ public List<ClasspathResource> findByRegex(String search) { List<ClasspathResource> allResources = findAllClasspathResources(); List<ClasspathResource> matches = new ArrayList<>(); Pattern pattern = Pattern.compile(search); for (ClasspathResource resource : allResources) { if (resource != null && resource.getName() != null && pattern.matcher(resource.getName()).find()) { matches.add(resource); } } return matches; }
/** * * finds a resource on the classpath using a regular expression. * * @param search - search regular expression * @return - the list of classpath resources that match the regular expression */ public List<ClasspathResource> findByRegex(String search) { List<ClasspathResource> allResources = findAllClasspathResources(); List<ClasspathResource> matches = new ArrayList<>(); Pattern pattern = Pattern.compile(search); for (ClasspathResource resource : allResources) { if (resource != null && resource.getName() != null && pattern.matcher(resource.getName()).find()) { matches.add(resource); } } return matches; }
public JHades findByRegex(String search) { if (search == null || search.isEmpty()) { throw new IllegalArgumentException("search string cannot be null or empty."); } System.out.println(">> jHades search >> Searching for resorce using search string: " + search + "\n"); List<ClasspathResource> classpathResources = scanner.findByRegex(search); boolean resultsFound = classpathResources != null && classpathResources.size() > 0; if (resultsFound) { System.out.println("\nResults Found:\n"); for (ClasspathResource classpathResource : classpathResources) { System.out.println(classpathResource.getName()); } } endCommand(resultsFound); return this; }