{"record":{"id":"3d0c5ee526a7ed69","repo":"pentaho/pentaho-kettle","slug":"pgpdecryptstreammeta-exception-unabletoreadstepinfo","errorCode":null,"errorMessage":"PGPDecryptStreamMeta.Exception.UnableToReadStepInfo","messagePattern":"PGPDecryptStreamMeta\\.Exception\\.UnableToReadStepInfo","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/pgpdecryptstream/PGPDecryptStreamMeta.java","lineNumber":233,"sourceCode":"    retval.append( \"    \" ).append(\n      XMLHandler.addTagValue( \"passhrase\", Encr.encryptPasswordIfNotUsingVariables( passhrase ) ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"streamfield\", streamfield ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"resultfieldname\", resultfieldname ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"passphraseFromField\", passphraseFromField ) );\n    retval.append( \"    \" + XMLHandler.addTagValue( \"passphraseFieldName\", passphraseFieldName ) );\n    return retval.toString();\n  }\n\n  private void readData( Node stepnode, List<DatabaseMeta> databases ) throws KettleXMLException {\n    try {\n      gpglocation = XMLHandler.getTagValue( stepnode, \"gpglocation\" );\n      passhrase = Encr.decryptPasswordOptionallyEncrypted( XMLHandler.getTagValue( stepnode, \"passhrase\" ) );\n      streamfield = XMLHandler.getTagValue( stepnode, \"streamfield\" );\n      resultfieldname = XMLHandler.getTagValue( stepnode, \"resultfieldname\" );\n      passphraseFromField = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, \"passphraseFromField\" ) );\n      passphraseFieldName = XMLHandler.getTagValue( stepnode, \"passphraseFieldName\" );\n    } catch ( Exception e ) {\n      throw new KettleXMLException( BaseMessages.getString(\n        PKG, \"PGPDecryptStreamMeta.Exception.UnableToReadStepInfo\" ), e );\n    }\n  }\n\n  @Override\n  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {\n    try {\n      gpglocation = rep.getStepAttributeString( id_step, \"gpglocation\" );\n      passhrase = Encr.decryptPasswordOptionallyEncrypted( rep.getStepAttributeString( id_step, \"passhrase\" ) );\n\n      streamfield = rep.getStepAttributeString( id_step, \"streamfield\" );\n      resultfieldname = rep.getStepAttributeString( id_step, \"resultfieldname\" );\n      passphraseFromField = rep.getStepAttributeBoolean( id_step, \"passphraseFromField\" );\n      passphraseFieldName = rep.getStepAttributeString( id_step, \"passphraseFieldName\" );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"PGPDecryptStreamMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/pgpdecryptstream/PGPDecryptStreamMeta.java#L215-L251","documentation":"PGPDecryptStreamMeta.loadXML throws KettleXMLException when it cannot parse the step's XML definition into step metadata (passphrase, stream field, result field, passphrase-from-field settings). It wraps the underlying exception so callers know which step failed to load. Thrown from readData while reading the <stepnode> XML tags.","triggerScenarios":"Loading a transformation (.ktr) whose PGP decrypt stream step XML contains malformed or unexpected content, or an XMLHandler.getTagValue call throws (invalid XML structure, wrong node type).","commonSituations":"Hand-edited or corrupted .ktr files, transformations produced by older/newer Pentaho versions with different step XML layout, copy-paste corruption of XML.","solutions":["Open the .ktr in Spoon and re-save the PGP Decrypt Stream step to regenerate valid XML","Validate the XML file is well-formed (xmllint or an XML editor)","Compare the step's XML block against a working transformation and fix missing/renamed tags","Check Pentaho/PDI version compatibility between the file and your runtime"],"exampleFix":"// before: hand-edited XML missing passphrase tag\n<passhrase></passphrase>\n// after: correct matching tag\n<passhrase>encrypted_value</passhrase>","handlingStrategy":"try-catch","validationCode":"// Validate .ktr XML before loading\nDocumentBuilderFactory f = DocumentBuilderFactory.newInstance();\nDocument doc = f.newDocumentBuilder().parse(new File(\"trans.ktr\"));\nNodeList steps = doc.getElementsByTagName(\"step\");\nfor (int i = 0; i < steps.getLength(); i++) {\n  Element s = (Element) steps.item(i);\n  if (\"PGPDecryptStream\".equals(s.getAttribute(\"type\"))) {\n    if (s.getElementsByTagName(\"passhrase\").getLength() == 0) {\n      throw new IllegalStateException(\"PGP step XML missing <passhrase> tag\");\n    }\n  }\n}","typeGuard":null,"tryCatchPattern":"try { transMeta.loadXML(file, null, null); }\ncatch (KettleXMLException e) {\n  if (e.getMessage().contains(\"UnableToReadStepInfo\")) {\n    log.error(\"PGP decrypt step XML is malformed: \" + e.getCause(), e);\n  } else { throw e; }\n}","preventionTips":["Never hand-edit .ktr files; edit in Spoon","Keep PDI versions consistent between authors and runners","Version-control transformations and diff XML after edits","Validate XML well-formedness before deployment"],"tags":["xml","kettle","step-metadata","deserialization"],"backgroundTag":"json-unmarshal-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"}