pentaho/pentaho-kettle · error · KettleException

PurRepository.fileUpdateException

PurRepository.fileUpdateException

Error message

PurRepository.fileUpdateException (localized, takes file name; error updating file)

What it means

When updating an existing file, a SOAPFaultException carrying UnifiedRepositoryUpdateFileException.PREFIX indicates the server rejected the file update. PurRepository rewraps it as a localized 'error updating file' KettleException including the file name. Common server-side causes: version conflicts, name collisions, or permission problems during update.

Solutions

  1. Check the server logs for the underlying UnifiedRepositoryUpdateFileException cause to see the real reason
  2. Retry after resolving the conflict (refresh/reload the latest file version)
  3. Ensure the user has write permission on the file and its folder
  4. If the update collides with an existing name, use Save As with a unique name
Defensive patterns

Strategy: try-catch

Try / catch

try {
  repository.save(element, comment, null, true);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("error updating")) {
    log.error("Update failed for " + element.getName(), e);
    // reload latest version and retry, or Save As
  } else throw e;
}

Prevention

When it happens

Trigger: pur.updateFile(...) throws SOAPFaultException whose message contains UnifiedRepositoryUpdateFileException.PREFIX — i.e. the backend UnifiedRepository explicitly signaled an update failure.

Common situations: Concurrent modification of the same file by two users (version conflict); renaming an update to a name already used in the folder; losing write permission on the target file; repository server versioning/jcr issues.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/7001fbe4e5574944. Report an issue: GitHub.

Appendix: source

Thrown at plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java:3480

        }
      } finally {
        readWriteLock.readLock().unlock();
      }

      readWriteLock.writeLock().lock();
      try {
        // update title and description
        file =
          new RepositoryFile.Builder( file ).title( RepositoryFile.DEFAULT_LOCALE, element.getName() ).createdDate(
            versionDate != null ? versionDate.getTime() : new Date() ).description( RepositoryFile.DEFAULT_LOCALE,
            Const.NVL( element.getDescription(), "" ) ).build();

        file =
          pur.updateFile( file, new NodeRepositoryFileData( objectTransformer.elementToDataNode( element ) ),
            versionComment );
      } catch ( SOAPFaultException e ) {
        if ( e.getMessage().contains( UnifiedRepositoryUpdateFileException.PREFIX ) ) {
          throw new KettleException(
            BaseMessages.getString( PKG, "PurRepository.fileUpdateException", file.getName() ) );
        }
        throw e;
      } finally {
        readWriteLock.writeLock().unlock();
      }

      if ( checkRename && isRenamed( element, file ) ) {
        renameKettleEntity( element, null, element.getName() );
      }
    } else {

      int dataSize = calculateDataSize( element );

      readWriteLock.writeLock().lock();
      try {
        file =
          new RepositoryFile.Builder( checkAndSanitize( element.getName()

View on GitHub (pinned to f3058517a1)