public void fireListeners() { for(ClasspathResource resource : classpaths) { resource.fireListeners(); } }
/** * looks through all of the classpaths we have and finds the one that ends in target/test-classes - if it finds it, it returns its parent. * * @return - the base directory of the application currently running (if any) */ public static File findTestClassesBasePath() { for(Classpath cp : resources.values()) { for(ClasspathResource cr : cp.classpaths) { if (cr.isTestClasspath()) { return cr.getClassesSource().getParentFile().getParentFile(); } } } return null; } }
private void foundJar(String path, URL url, Map<String, ClasspathResource> fileMap, String offset, List<ClasspathResource> myResources) { ClasspathResource resource;File jarFile = new File(path); if (jarFile.exists()) { resource = new ClasspathResource(jarFile, url); if (offset != null) { resource.addJarOffset(offset, url); } fileMap.put(path, resource); myResources.add(resource); } else { log.info("classpath scan: {} cannot be found", path); } }
/** * Spelunks through the classpath looking for the resources */ public void fireListeners() { if (jarOffsets.size() == 0 || (jarOffsets.size() == 1 && jarOffsets.iterator().next().listeners.size() == 0)) { return; // no-one is interested } List<ResourceScanListener.ScanResource> scanResources = new ArrayList<>(MAX_RESOURCES); if (classesSource.isDirectory()) { OffsetListener listener = jarOffsets.iterator().next(); // only process if anyone is listening if (listener.listeners.size() > 0) { processDirectory(scanResources, classesSource, "", listener); fireFileResourceListeners(scanResources, listener); } } else if (!externalHandler(scanResources)) { processJarFile(scanResources); } }
OffsetListener newOffsetListener = findOffsetListener(entry.getName()); fireListeners(scanResources, offsetListener, jf); fireListeners(scanResources, offsetListener, jf); scanResources.add(new ResourceScanListener.ScanResource(currentUrl, entry, resourceName(offsetStrip, entry.getName()), offsetListener.interestingResource.url)); fireListeners(scanResources, offsetListener, jf);
@Override public boolean handlesClasspathResource(ClasspathResource resource, List<ResourceScanListener.ScanResource> scanResources) throws IOException { for(ClasspathResource.OffsetListener jarOffset : resource.getJarOffsets()) { String offset = jarOffset.jarOffset; // must be null, 0 or ending with .jar if (!(offset == null || offset.length() == 0 || offset.endsWith(".jar!/"))) { return false; } } // ok, looks like Spring loaded, or at least something Spring loaded can handle. JarFile jarFile = new JarFile(resource.getClassesSource()); for(ClasspathResource.OffsetListener jarOffset : resource.getJarOffsets()) { if (jarOffset.listeners != null && jarOffset.listeners.size() > 0) { String offset = jarOffset.jarOffset; JarFile processFile = jarFile; if (offset.endsWith(".jar!/")) { processFile = getNestedJarFile(jarFile, offset.substring(0, offset.length() - SEPARATOR.length())); } extractJarEntries(resource, jarOffset, scanResources, processFile); } } return true; }
public void askForInterest() { if (uncheckedListeners.size() > 0) { for(ClasspathResource resource : classpaths) { resource.askListeners(uncheckedListeners); } } // clearing them allows us to all this over and over and not worry uncheckedListeners.clear(); }
protected void processJarFile(List<ResourceScanListener.ScanResource> scanResources) { JarFile jf = null; try { jf = new JarFile(classesSource); } catch (IOException e) { log.error("You have a non jar-file resource on your classpath {}", classesSource.getAbsolutePath()); return; } try { extractJarEntries(scanResources, jf); } finally { try { jf.close(); } catch (IOException e) { log.error("Unable to close jar file {}", classesSource); } } }
private void processFile(List<ResourceScanListener.ScanResource> scanResources, String packageName, OffsetListener listener, File file) { scanResources.add(new ResourceScanListener.ScanResource(url, file, packageName + "/" + file.getName())); if (scanResources.size() >= MAX_RESOURCES) { fireFileResourceListeners(scanResources, listener); } }
private void processJarResource(String path, URL url, Map<String, ClasspathResource> fileMap, List<ClasspathResource> myResources) { path = path.substring(JAR_PREFIX.length() + FILE_PREFIX.length()); String offset = null; int offsetPos = path.indexOf('!'); if (offsetPos != -1) { offset = path.substring(offsetPos + 1); path = path.substring(0, offsetPos); } // does it already exist in the map? if so, stop processing and ignore ClasspathResource resource = fileMap.get(path); if (resource != null) { if (offset != null) { resource.addJarOffset(offset, url); } } else { foundJar(path, url, fileMap, offset, myResources); } }
public void triggerNotifications() { Set<ResourceScanListener> listeners = new HashSet<>(); for(ClasspathResource resource : classpaths) { resource.collectInUseListeners(listeners); } listeners.addAll(uncheckedListeners); notifyAction(listeners, ResourceScanListener.ScanAction.STARTING); askForInterest(); fireListeners(); cleanListeners(); notifyAction(listeners, ResourceScanListener.ScanAction.COMPLETE); }
public void extractJarEntries(ClasspathResource resource, ClasspathResource.OffsetListener offsetListener, List<ResourceScanListener.ScanResource> scanResources, java.util.jar.JarFile jf) { Enumeration<java.util.jar.JarEntry> entries = jf.entries(); while (entries.hasMoreElements()) { java.util.jar.JarEntry entry = entries.nextElement(); if (!entry.getName().endsWith(SEPARATOR)) { if (scanResources.size() >= ClasspathResource.MAX_RESOURCES) { resource.fireListeners(scanResources, offsetListener, jf); } } scanResources.add(new ResourceScanListener.ScanResource(offsetListener.interestingResource.url, entry, entry.getName(), offsetListener.interestingResource.url)); } // anything remaining resource.fireListeners(scanResources, offsetListener, jf); }