pentaho/pentaho-kettle · error · KettleXMLException

CubeOutputMeta.Exception.UnableToLoadStepInfo

CubeOutputMeta.Exception.UnableToLoadStepInfo

Error message

CubeOutputMeta.Exception.UnableToLoadStepInfo

What it means

CubeOutputMeta.readData parses the step's XML node (file name, add_to_result_filenames, do_not_open_newfile_init tags) when loading a transformation from a .ktr file. Any exception during XML parsing is wrapped in a KettleXMLException with message 'CubeOutputMeta.Exception.UnableToLoadStepInfo'. It means the Cube Output step's XML definition is malformed or missing required tags.

Solutions

  1. Open the .ktr in a text editor and check the Cube Output step's <file> XML block (file_name, add_to_result_filenames, do_not_open_newfile_init) for missing/malformed tags.
  2. Re-create the Cube Output step in Spoon and re-save the transformation.
  3. Restore the transformation from backup or version control.
  4. Compare the XML with a working transformation saved by the same PDI version and reconcile differences.

Example fix

// before: broken step XML
<step><name>Cube output</name><type>CubeOutput</type></step>
// after: complete file block
<step><name>Cube output</name><type>CubeOutput</type>
  <file><file_name>file.cube</file_name>
    <add_to_result_filenames>N</add_to_result_filenames>
    <do_not_open_newfile_init>N</do_not_open_newfile_init>
  </file>
</step>
Defensive patterns

Strategy: validation

Validate before calling

// Validate the .ktr XML before loading
Document doc = XMLHandler.loadXMLFile(ktrFile);
if (XMLHandler.getSubNode(XMLHandler.getSubNode(doc, "transformation"), "step") == null) {
  throw new KettleException("ktr file has no steps");
}
// ensure CubeOutput steps contain a <file> block
NodeList steps = doc.getElementsByTagName("step");

Try / catch

try { transMeta = new TransMeta(ktrPath); } catch (KettleXMLException e) { logError("Unable to load step info from " + ktrPath + ": " + e.getMessage(), e); transMeta = restoreFromBackup(ktrPath); }

Prevention

When it happens

Trigger: loadXML -> readData on a <step> node whose <file> element is missing, has unexpected structure, or the XML document is truncated/corrupted so XMLHandler.getTagValue fails or returns invalid data.

Common situations: Hand-edited or corrupted .ktr files; ktr generated by another tool missing the <file> tags; version drift where an older/newer PDI wrote tags this reader does not expect; file truncated by a failed transfer.

Understand the failure class

Background: JSON parse error: "Unexpected token" / "not valid JSON" / "failed to parse" — what JSON parsers are really complaining about — this error's family across 45 libraries.

Related errors


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

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/cubeoutput/CubeOutputMeta.java:133

    this.doNotOpenNewFileInit = doNotOpenNewFileInit;
  }

  public Object clone() {
    CubeOutputMeta retval = (CubeOutputMeta) super.clone();

    return retval;
  }

  private void readData( Node stepnode ) throws KettleXMLException {
    try {
      filename = XMLHandler.getTagValue( stepnode, "file", "name" );
      addToResultFilenames =
        "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "file", "add_to_result_filenames" ) );
      doNotOpenNewFileInit =
        "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "file", "do_not_open_newfile_init" ) );

    } catch ( Exception e ) {
      throw new KettleXMLException(
        BaseMessages.getString( PKG, "CubeOutputMeta.Exception.UnableToLoadStepInfo" ), e );
    }
  }

  public void setDefault() {
    filename = "file.cube";
    addToResultFilenames = false;
    doNotOpenNewFileInit = false;
  }

  public String getXML() {
    StringBuilder retval = new StringBuilder( 300 );

    retval.append( "    <file>" ).append( Const.CR );
    retval.append( "      " ).append( XMLHandler.addTagValue( "name", filename ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "add_to_result_filenames", addToResultFilenames ) );
    retval.append( "      " ).append( XMLHandler.addTagValue( "do_not_open_newfile_init", doNotOpenNewFileInit ) );

View on GitHub (pinned to f3058517a1)