private WorkspaceDirectoryResource handleDirectory(WorkspaceResourceBuilder builder, Path directoryPath) throws IOException {
		logger.info("Reading input from directory '{}'", directoryPath);
		BasicJvmClassBundle classes = new BasicJvmClassBundle();
		BasicFileBundle files = new BasicFileBundle();
		Map<String, AndroidClassBundle> androidClassBundles = new HashMap<>();
		NavigableMap<Integer, VersionedJvmClassBundle> versionedJvmClassBundles = new TreeMap<>();
		Map<String, WorkspaceFileResource> embeddedResources = new HashMap<>();

		// Walk the directory
		Files.walkFileTree(directoryPath, new SimpleFileVisitor<>() {
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				try {
					// Read info from file
					ByteSource source = ByteSources.forPath(file);
					String fileName = directoryPath.relativize(file).toString();
					if (File.separator.equals("\\"))
						fileName = fileName.replace('\\', '/');
					Info info = infoImporter.readInfo(fileName, source);

					// Add the info to the appropriate bundle
					addInfo(classes, files, androidClassBundles, versionedJvmClassBundles, embeddedResources,
							source, fileName, info);
				} catch (IOException ex) {
					logger.error("IO error reading ZIP entry '{}' - skipping", file, ex);
				}

				return FileVisitResult.CONTINUE;
			}
		});
		return builder
				.withJvmClassBundle(classes)
				.withAndroidClassBundles(androidClassBundles)
				.withVersionedJvmClassBundles(versionedJvmClassBundles)
				.withFileBundle(files)
				.withEmbeddedResources(embeddedResources)
				.withDirectoryPath(directoryPath)
				.build();
	}
General read handling for any single-file resource kind. Delegates to others when needed.

@param builder
		Builder to work with.
@param pathName
		Name of input file / content.
@param source
		Access to content / data.

@return Read resource.
recaf-core/src/main/java/software/coley/recaf/services/workspace/io/BasicResourceImporter.java