public IncrementalBuildResults applyBatchResourceChanges(
      final Map<org.uberfire.backend.vfs.Path, Collection<ResourceChange>> changes) {
    synchronized (kieFileSystem) {
      checkNotNull("changes", changes);

      checkAFullBuildHasBeenPerformed();

      // Add all changes to KieFileSystem before executing the build
      final List<String> changedFilesKieBuilderPaths = new ArrayList<String>();
      final List<ValidationMessage> nonKieResourceValidatorAddedMessages =
          new ArrayList<ValidationMessage>();
      final List<ValidationMessage> nonKieResourceValidatorRemovedMessages =
          new ArrayList<ValidationMessage>();

      for (final Map.Entry<org.uberfire.backend.vfs.Path, Collection<ResourceChange>>
          pathCollectionEntry : changes.entrySet()) {
        for (final ResourceChange change : pathCollectionEntry.getValue()) {
          final ResourceChangeType type = change.getType();
          final Path resource = Paths.convert(pathCollectionEntry.getKey());

          checkNotNull("type", type);
          checkNotNull("resource", resource);

          final String destinationPath =
              resource.toUri().toString().substring(projectPrefix.length() + 1);
          changedFilesKieBuilderPaths.add(destinationPath);
          switch (type) {
            case ADD:
            case UPDATE:
              // Only files can be processed
              if (!Files.isRegularFile(resource)) {
                continue;
              }

              update(
                  nonKieResourceValidatorAddedMessages,
                  nonKieResourceValidatorRemovedMessages,
                  resource,
                  destinationPath);

              break;
            case DELETE:
              delete(nonKieResourceValidatorRemovedMessages, resource, destinationPath);
          }
        }
      }

      // Perform the Incremental build and get messages from incremental build
      final IncrementalBuildResults results = new IncrementalBuildResults(projectGAV);
      buildIncrementally(results, toArray(changedFilesKieBuilderPaths));

      // Copy in BuildMessages for non-KIE resources
      results.addAllAddedMessages(convertValidationMessages(nonKieResourceValidatorAddedMessages));
      results.addAllRemovedMessages(
          convertValidationMessages(nonKieResourceValidatorRemovedMessages));

      return results;
    }
  }
 void onResourceBatchEvent(@Observes final ResourceBatchChangesEvent batchEvent) {
   if (path != null && batchEvent.containPath(path)) {
     if (sessionInfo.getId().equals(batchEvent.getSessionInfo().getId())) {
       for (final ResourceChange change : batchEvent.getChanges(path)) {
         switch (change.getType()) {
           case COPY:
             executeCopyCommands();
             break;
           case DELETE:
             executeDeleteCommands();
             break;
           case RENAME:
             path = ((ResourceRenamed) change).getDestinationPath();
             executeRenameCommands();
             break;
           case UPDATE:
             executeUpdateCommands();
             break;
         }
       }
     } else {
       for (final ResourceChange change : batchEvent.getChanges(path)) {
         switch (change.getType()) {
           case COPY:
             executeConcurrentCopyCommand(
                 path,
                 ((ResourceCopied) change).getDestinationPath(),
                 batchEvent.getSessionInfo().getId(),
                 batchEvent.getSessionInfo().getIdentity());
             break;
           case DELETE:
             executeConcurrentDeleteCommand(
                 path,
                 batchEvent.getSessionInfo().getId(),
                 batchEvent.getSessionInfo().getIdentity());
             break;
           case RENAME:
             path = ((ResourceRenamed) change).getDestinationPath();
             executeConcurrentRenameCommand(
                 path,
                 ((ResourceRenamed) change).getDestinationPath(),
                 batchEvent.getSessionInfo().getId(),
                 batchEvent.getSessionInfo().getIdentity());
             break;
           case UPDATE:
             executeConcurrentUpdateCommand(
                 path,
                 batchEvent.getSessionInfo().getId(),
                 batchEvent.getSessionInfo().getIdentity());
             break;
         }
       }
     }
   }
 }