{"record":{"id":"3ddeb551c3a6b27e","repo":"pentaho/pentaho-kettle","slug":"unable-to-load-job-entry-of-type-special-from-xml-node","errorCode":null,"errorMessage":"Unable to load job entry of type 'special' from XML node","messagePattern":"Unable to load job entry of type 'special' from XML node","errorType":"exception","errorClass":"KettleXMLException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/special/JobEntrySpecial.java","lineNumber":114,"sourceCode":"    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      start = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"start\" ) );\n      dummy = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"dummy\" ) );\n      repeat = \"Y\".equalsIgnoreCase( XMLHandler.getTagValue( entrynode, \"repeat\" ) );\n      setSchedulerType( Const.toInt( XMLHandler.getTagValue( entrynode, \"schedulerType\" ), NOSCHEDULING ) );\n      setIntervalSeconds( Const.toInt( XMLHandler.getTagValue( entrynode, \"intervalSeconds\" ), 0 ) );\n      setIntervalMinutes( Const.toInt( XMLHandler.getTagValue( entrynode, \"intervalMinutes\" ), 0 ) );\n      setHour( Const.toInt( XMLHandler.getTagValue( entrynode, \"hour\" ), 0 ) );\n      setMinutes( Const.toInt( XMLHandler.getTagValue( entrynode, \"minutes\" ), 0 ) );\n      setWeekDay( Const.toInt( XMLHandler.getTagValue( entrynode, \"weekDay\" ), 0 ) );\n      setDayOfMonth( Const.toInt( XMLHandler.getTagValue( entrynode, \"dayOfMonth\" ), 0 ) );\n    } catch ( KettleException e ) {\n      throw new KettleXMLException( \"Unable to load job entry of type 'special' from XML node\", e );\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      start = rep.getJobEntryAttributeBoolean( id_jobentry, \"start\" );\n      dummy = rep.getJobEntryAttributeBoolean( id_jobentry, \"dummy\" );\n      repeat = rep.getJobEntryAttributeBoolean( id_jobentry, \"repeat\" );\n      schedulerType = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"schedulerType\" );\n      intervalSeconds = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"intervalSeconds\" );\n      intervalMinutes = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"intervalMinutes\" );\n      hour = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"hour\" );\n      minutes = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"minutes\" );\n      weekDay = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"weekDay\" );\n      dayOfMonth = (int) rep.getJobEntryAttributeInteger( id_jobentry, \"dayOfMonth\" );\n    } catch ( KettleDatabaseException dbe ) {\n      throw new KettleException( \"Unable to load job entry of type 'special' from the repository for id_jobentry=\"","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/special/JobEntrySpecial.java#L96-L132","documentation":"JobEntrySpecial.loadXML wraps any KettleException raised while parsing the 'special' (scheduler) job entry's XML tags (e.g. intervalMinutes, hour, minutes, weekDay, dayOfMonth, repeat flags) and rethrows as KettleXMLException 'Unable to load job entry of type special from XML node'. The schedule metadata in the job file could not be parsed.","triggerScenarios":"Loading a .kjb whose <special> entry node has malformed XML or throws while XMLHandler.getTagValue/Const.toInt conversion runs inside the try block.","commonSituations":"Hand-edited job file with broken tags; truncated/corrupted download or transfer; old-format job file opened in a newer Pentaho version with changed node structure.","solutions":["Inspect the .kjb XML around the 'special' entry and fix malformed tags or values.","Restore the job file from backup or version control.","Recreate the Start/scheduler entry in Spoon and re-save the job.","Verify file encoding and that the file was not altered in transfer (line-ending or BOM corruption)."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();\ndb.parse(new File(\"job.kjb\")); // reject malformed job XML before kettle loads it","typeGuard":null,"tryCatchPattern":"try {\n  entry.loadXML(entryNode, databases, slaveServers, rep, metaStore);\n} catch (KettleXMLException e) {\n  logger.error(\"'special' entry XML invalid: \" + e.getMessage(), e);\n  // fall back to default schedule or abort load\n}","preventionTips":["Edit scheduling settings in Spoon, not in raw XML.","Validate .kjb files after any script-based modification.","Diff job files in version control to catch accidental edits.","Ensure correct file encoding and complete transfers."],"tags":["kettle","xml","scheduler","job-entry"],"backgroundTag":"json-parse-error","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"}