{"record":{"id":"16265dd1aebd1f43","repo":"pentaho/pentaho-kettle","slug":"purrepository-faileddirectorycreation-message","errorCode":"PurRepository.FailedDirectoryCreation.Message","errorMessage":"PurRepository.FailedDirectoryCreation.Message","messagePattern":"PurRepository\\.FailedDirectoryCreation\\.Message","errorType":"error_code","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java","lineNumber":441,"sourceCode":"          // create this one\n          child = new RepositoryDirectory( follow, path[level] );\n          saveRepositoryDirectory( child );\n          // link this with the parent directory\n          follow.addSubdirectory( child );\n        }\n\n        follow = child;\n      }\n      return follow;\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to create directory with path [\" + directoryPath + \"]\", e );\n    }\n  }\n\n  @Override public void saveRepositoryDirectory( final RepositoryDirectoryInterface dir ) throws KettleException {\n    // id of root dir is null--check for it\n    if ( \"/\".equals( dir.getParent().getName() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"PurRepository.FailedDirectoryCreation.Message\" ) );\n    }\n\n    readWriteLock.writeLock().lock();\n    try {\n      RepositoryFile\n        newFolder =\n        pur.createFolder( dir.getParent().getObjectId() != null ? dir.getParent().getObjectId().getId() : null,\n          new RepositoryFile.Builder( dir.getName() ).folder( true ).build(), null );\n\n      dir.setObjectId( new StringObjectId( newFolder.getId().toString() ) );\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to save repository directory with path [\" + getPath( null, dir, null ) + \"]\",\n        e );\n    } finally {\n      readWriteLock.writeLock().unlock();\n    }\n  }\n","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/pur/core/src/main/java/org/pentaho/di/repository/pur/PurRepository.java#L423-L459","documentation":"saveRepositoryDirectory refuses to save (i.e., create) a directory whose parent is the repository root, since root-level folders are managed by the system. It throws a localized KettleException keyed by PurRepository.FailedDirectoryCreation.Message.","triggerScenarios":"Calling saveRepositoryDirectory(dir) with dir.getParent() being the root (parent name \"/\") — typically reached from createRepositoryDirectory or UI \"new folder\" flows when the target parent is root.","commonSituations":"UI/tooling letting users pick the root as destination for a new folder; programmatic migration code saving directories whose parent is root.","solutions":["Ensure new directories are created under /home or /public, never as children of root.","Re-parent the directory to a valid parent before calling saveRepositoryDirectory.","Use createRepositoryDirectory (which validates /home//public paths) instead of saving a root child."],"exampleFix":"// before\nrepo.saveRepositoryDirectory(dir); // dir.parent == root\n// after\nif (!\"/\".equals(dir.getParent().getName())) { repo.saveRepositoryDirectory(dir); } else { /* re-parent under /public first */ }","handlingStrategy":"validation","validationCode":"if (dir.getParent() == null || \"/\".equals(dir.getParent().getName())) throw new IllegalArgumentException(\"cannot save a directory whose parent is root; re-parent under /home or /public\");","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Guard parent-is-root before any saveRepositoryDirectory call","Use createRepositoryDirectory for root-relative path creation","Restrict UI folder pickers to /home and /public subtrees"],"tags":["pentaho","repository","directory"],"backgroundTag":"invalid-state-transition","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}