private void visitPaths(final DirectoryStream<org.uberfire.java.nio.file.Path> directoryStream) {
    for (final org.uberfire.java.nio.file.Path path : directoryStream) {
      if (Files.isDirectory(path)) {
        visitPaths(Files.newDirectoryStream(path));

      } else {
        // Don't process dotFiles
        if (!dotFileFilter.accept(path)) {

          // Resource Type might require "external" validation (i.e. it's not covered by Kie)
          final BuildValidationHelper validator = getBuildValidationHelper(path);
          if (validator != null) {
            nonKieResourceValidationHelpers.put(path, validator);
          }

          // Add new resource
          final String destinationPath =
              path.toUri().toString().substring(projectPrefix.length() + 1);
          final InputStream is = ioService.newInputStream(path);
          final BufferedInputStream bis = new BufferedInputStream(is);
          kieFileSystem.write(
              destinationPath,
              KieServices.Factory.get().getResources().newInputStreamResource(bis));
          handles.put(getBaseFileName(destinationPath), Paths.convert(path));

          // Java classes are handled by KIE so we can safely post-process them here
          addJavaClass(path);
        }
      }
    }
  }
  public IncrementalBuildResults addResource(final Path resource) {
    synchronized (kieFileSystem) {
      checkNotNull("resource", resource);

      // Only files can be processed
      if (!Files.isRegularFile(resource)) {
        return new IncrementalBuildResults(projectGAV);
      }

      checkAFullBuildHasBeenPerformed();

      // Resource Type might require "external" validation (i.e. it's not covered by Kie)
      final IncrementalBuildResults results = new IncrementalBuildResults(projectGAV);
      final BuildValidationHelper validator = getBuildValidationHelper(resource);
      if (validator != null) {
        final List<ValidationMessage> addedValidationMessages =
            validator.validate(Paths.convert(resource));

        results.addAllAddedMessages(convertValidationMessages(addedValidationMessages));
        results.addAllRemovedMessages(
            convertValidationMessages(nonKieResourceValidationHelperMessages.remove(resource)));

        nonKieResourceValidationHelpers.put(resource, validator);
        nonKieResourceValidationHelperMessages.put(resource, addedValidationMessages);
      }

      // Add new resource
      final String destinationPath =
          resource.toUri().toString().substring(projectPrefix.length() + 1);
      final InputStream is = ioService.newInputStream(resource);
      final BufferedInputStream bis = new BufferedInputStream(is);
      kieFileSystem.write(
          destinationPath, KieServices.Factory.get().getResources().newInputStreamResource(bis));
      addJavaClass(resource);
      handles.put(getBaseFileName(destinationPath), Paths.convert(resource));

      buildIncrementally(results, destinationPath);

      return results;
    }
  }
  private void update(
      final List<ValidationMessage> nonKieResourceValidatorAddedMessages,
      final List<ValidationMessage> nonKieResourceValidatorRemovedMessages,
      final Path resource,
      final String destinationPath) {
    // Resource Type might require "external" validation (i.e. it's not covered by Kie)
    final BuildValidationHelper validator = getBuildValidationHelper(resource);
    if (validator != null) {
      final List<ValidationMessage> addedValidationMessages =
          validator.validate(Paths.convert(resource));

      if (!(addedValidationMessages == null || addedValidationMessages.isEmpty())) {
        for (ValidationMessage validationMessage : addedValidationMessages) {
          nonKieResourceValidatorAddedMessages.add(validationMessage);
        }
      }

      final List<ValidationMessage> removedValidationMessages =
          nonKieResourceValidationHelperMessages.remove(resource);
      if (!(removedValidationMessages == null || removedValidationMessages.isEmpty())) {
        for (ValidationMessage validationMessage : removedValidationMessages) {
          nonKieResourceValidatorRemovedMessages.add(validationMessage);
        }
      }
      nonKieResourceValidationHelpers.put(resource, validator);
      nonKieResourceValidationHelperMessages.put(resource, addedValidationMessages);
    }

    // Add new resource
    final InputStream is = ioService.newInputStream(resource);
    final BufferedInputStream bis = new BufferedInputStream(is);
    kieFileSystem.write(
        destinationPath, KieServices.Factory.get().getResources().newInputStreamResource(bis));
    addJavaClass(resource);
    handles.put(getBaseFileName(destinationPath), Paths.convert(resource));
  }