{"record":{"id":"0699fb6aad3f1864","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-repository-meta-object","errorCode":null,"errorMessage":"Unable to load repository meta object","messagePattern":"Unable to load repository meta object","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/BaseRepositoryMeta.java","lineNumber":124,"sourceCode":"    this.name = name;\n    this.description = description;\n    this.isDefault = isDefault;\n  }\n\n  /*\n   * (non-Javadoc)\n   *\n   * @see org.pentaho.di.repository.RepositoryMeta#loadXML(org.w3c.dom.Node, java.util.List)\n   */\n  public void loadXML( Node repnode, List<DatabaseMeta> databases ) throws KettleException {\n    try {\n      // Fix for PDI-2508: migrating from 3.2 to 4.0 causes NPE on startup.\n      id = Const.NVL( XMLHandler.getTagValue( repnode, \"id\" ), id );\n      name = XMLHandler.getTagValue( repnode, \"name\" );\n      description = XMLHandler.getTagValue( repnode, \"description\" );\n      isDefault = Boolean.valueOf( XMLHandler.getTagValue( repnode, \"is_default\" ) );\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to load repository meta object\", e );\n    }\n  }\n\n  /*\n   * (non-Javadoc)\n   *\n   * @see org.pentaho.di.repository.RepositoryMeta#getXML()\n   */\n  public String getXML() {\n    StringBuilder retval = new StringBuilder( 100 );\n\n    retval.append( \"    \" ).append( XMLHandler.addTagValue( \"id\", id ) );\n    retval.append( \"    \" ).append( XMLHandler.addTagValue( \"name\", name ) );\n    retval.append( \"    \" ).append( XMLHandler.addTagValue( \"description\", description ) );\n    retval.append( \"    \" ).append( XMLHandler.addTagValue( \"is_default\", isDefault.toString() ) );\n\n    return retval.toString();\n  }","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/BaseRepositoryMeta.java#L106-L142","documentation":"BaseRepositoryMeta.loadXML throws KettleException 'Unable to load repository meta object' when any exception occurs while parsing a <repository> node from repositories.xml (id, name, description, is_default tags). The cause is chained.","triggerScenarios":"Loading repositories.xml containing a malformed repository element — unparseable is_default value, unexpected structure, or an exception in a subclass's loadXML extension.","commonSituations":"Hand-edited repositories.xml; repositories.xml migrated from PDI 3.2 to 4.0+ missing tags (see PDI-2508 fix); corrupted file after interrupted write.","solutions":["Read e.getCause() to identify the malformed tag","Fix or regenerate repositories.xml (connect to the repository once in Spoon to rewrite it)","Ensure <id>, <name>, <description>, <is_default> tags are present and well-formed","Back up and restore repositories.xml from a known-good machine"],"exampleFix":"// before: broken tag\n<repository><name>prod</name><is_default>yes-no-maybe</is_default></repository>\n// after\n<repository><id>KettleDatabaseRepository</id><name>prod</name><description>Prod</description><is_default>N</is_default></repository>","handlingStrategy":"validation","validationCode":"// Validate repositories.xml structure before RepositoriesMeta loads it\norg.w3c.dom.Document doc = org.pentaho.di.core.xml.XMLHandler.loadXMLFile(new java.io.File(repoXmlPath));\norg.w3c.dom.NodeList reps = doc.getElementsByTagName(\"repository\");\nfor (int i = 0; i < reps.getLength(); i++) {\n  if (org.pentaho.di.core.xml.XMLHandler.getTagValue(reps.item(i), \"id\") == null)\n    throw new IllegalStateException(\"repository #\" + i + \" missing <id>\");\n}","typeGuard":"static boolean isValidRepositoryNode(org.w3c.dom.Node repnode) {\n  return org.pentaho.di.core.xml.XMLHandler.getTagValue(repnode, \"id\") != null\n      && org.pentaho.di.core.xml.XMLHandler.getTagValue(repnode, \"name\") != null;\n}","tryCatchPattern":"try {\n  reposMeta.readData();\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"Unable to load repository meta object\")) {\n    throw new IllegalStateException(\"repositories.xml has a malformed <repository> node: \" + e.getCause(), e);\n  }\n  throw e;\n}","preventionTips":["Manage repositories.xml via configuration management, not hand edits","Include <id>, <name>, <description>, <is_default> in every repository element","Use is_default values 'Y'/'N' (Boolean.valueOf-safe)","Keep backups before migrating between PDI major versions"],"tags":["repository","xml","deserialization"],"backgroundTag":"schema-validation-failed","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"}