{"record":{"id":"473bebc75ac31986","repo":"pentaho/pentaho-kettle","slug":"error-0001-jobentrypgpverify-cannot-load-job-entry-from-xml","errorCode":"ERROR_0001","errorMessage":"JobEntryPGPVerify.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node","messagePattern":"JobEntryPGPVerify\\.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/pgpverify/JobEntryPGPVerify.java","lineNumber":105,"sourceCode":"    retval.append( super.getXML() );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"gpglocation\", gpglocation ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"filename\", filename ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"detachedfilename\", detachedfilename ) );\n    retval.append( \"      \" ).append( XMLHandler.addTagValue( \"useDetachedSignature\", useDetachedSignature ) );\n    return retval.toString();\n  }\n\n  public void loadXML( Node entrynode, List<DatabaseMeta> databases, List<SlaveServer> slaveServers,\n    Repository rep, IMetaStore metaStore ) throws KettleXMLException {\n    try {\n      super.loadXML( entrynode, databases, slaveServers );\n      gpglocation = XMLHandler.getTagValue( entrynode, \"gpglocation\" );\n      filename = XMLHandler.getTagValue( entrynode, \"filename\" );\n      detachedfilename = XMLHandler.getTagValue( entrynode, \"detachedfilename\" );\n      useDetachedSignature = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"useDetachedSignature\" ) );\n\n    } catch ( KettleXMLException xe ) {\n      throw new KettleXMLException( BaseMessages.getString(\n        PKG, \"JobEntryPGPVerify.ERROR_0001_Cannot_Load_Job_Entry_From_Xml_Node\" ), xe );\n    }\n  }\n\n  public void loadRep( Repository rep, IMetaStore metaStore, ObjectId id_jobentry, List<DatabaseMeta> databases,\n    List<SlaveServer> slaveServers ) throws KettleException {\n    try {\n      gpglocation = rep.getJobEntryAttributeString( id_jobentry, \"gpglocation\" );\n      filename = rep.getJobEntryAttributeString( id_jobentry, \"filename\" );\n      detachedfilename = rep.getJobEntryAttributeString( id_jobentry, \"detachedfilename\" );\n      useDetachedSignature = rep.getJobEntryAttributeBoolean( id_jobentry, \"useDetachedSignature\" );\n    } catch ( KettleException dbe ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"JobEntryPGPVerify.ERROR_0002_Cannot_Load_Job_From_Repository\", id_jobentry ), dbe );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_job ) throws KettleException {","sourceCodeStart":87,"sourceCodeEnd":123,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/pgpverify/JobEntryPGPVerify.java#L87-L123","documentation":"JobEntryPGPVerify.loadXML wraps any KettleXMLException thrown while reading this entry's XML node (gpglocation, filename, detachedfilename, useDetachedSignature tags) into a KettleXMLException with the ERROR_0001 'Cannot load job entry from XML node' message. The parser error is attached as the cause. It means the job's XML representation could not be deserialized into this entry.","triggerScenarios":"Loading a job from a .kjb file (or XML string) where XMLHandler.getTagValue parsing of the PGP verify entry node throws KettleXMLException: malformed XML, or the entry's XML structure is invalid/unexpected.","commonSituations":"Hand-edited .kjb file with broken XML; file truncated by a bad transfer; XML produced by a newer/older Pentaho version with an incompatible node layout; encoding problems in the file.","solutions":["Open the .kjb in an XML validator or Spoon to find the malformed node and fix the XML syntax","Restore the job file from version control or backup","If produced by another tool/version, re-export the job with a compatible Pentaho version"],"exampleFix":"// before\nJob job = new Job(null, metaStore, rep, name, rep.getJobObjectId(name)); // fails on bad XML\n// after\ntry {\n  job = new Job(null, metaStore, rep, name, rep.getJobObjectId(name));\n} catch (KettleXMLException e) {\n  logError(\"Invalid job XML for PGP verify entry: \" + e.getCause(), e);\n  // fall back to backup copy of the .kjb\n}","handlingStrategy":"try-catch","validationCode":"// before loading a .kjb\nDocument doc = XMLHandler.loadXMLFile(kjbFile);\nif (doc == null) throw new KettleException(\"Job file is not valid XML: \" + kjbFile);","typeGuard":null,"tryCatchPattern":"try {\n  jobMeta = new JobMeta(inputStream, null, null);\n} catch (KettleXMLException e) {\n  logError(\"Cannot parse job XML: \" + e.getCause(), e);\n  // restore from backup or fix the .kjb\n}","preventionTips":["Don't hand-edit .kjb files; use Spoon","Keep job files in version control so malformed edits are recoverable","Verify file integrity after transfers (size/checksum) before loading"],"tags":["xml","parsing","job-entry","kettle"],"backgroundTag":"xml-parse-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"}