- Files.createParentDirs(target);
- try (OutputStream stream = buildContext.newFileOutputStream(target)) {
- try (Writer fw = new OutputStreamWriter(stream, StandardCharsets.UTF_8)) {
- try (BufferedWriter bw = new BufferedWriter(fw)) {
- bw.write(cell.getValue().get());
- }
- } catch (IOException e) {
- LOG.error("Failed to write generate output into {}", target.getPath(), e);
- throw e;
+ dirs.put(target.getParentFile().toPath(), new GenerationTask(buildContext, target, cell.getValue()));
+ }
+ LOG.info("Generating {} Binding source files into {} directories", dirs.size(), dirs.keySet().size());
+
+ // Step three: wrap common FJ pool, submit parent directory creation tasks and wait for them to complete
+ sw.reset().start();
+ final ListeningExecutorService service = MoreExecutors.listeningDecorator(ForkJoinPool.commonPool());
+ final List<ListenableFuture<Void>> parentFutures = new ArrayList<>(dirs.keySet().size());
+ for (Entry<Path, Collection<GenerationTask>> entry : dirs.asMap().entrySet()) {
+ parentFutures.add(service.submit(() -> {
+ Files.createDirectories(entry.getKey());
+ return null;
+ }));
+ }
+
+ try {
+ Futures.whenAllComplete(parentFutures).call(() -> {
+ for (ListenableFuture<Void> future : parentFutures) {
+ Futures.getDone(future);