Skip to main content
IPED’s processing pipeline is built on a task-based architecture. Each task processes items sequentially, and you can create custom tasks by extending the AbstractTask class.

Task Architecture

Processing Pipeline

Tasks are executed in a specific order defined in TaskInstaller.xml. Each item flows through the pipeline:

Multi-threaded Execution

IPED creates multiple worker threads, and each worker has its own instance of each task:
  • Each task instance processes items independently
  • Shared data must use thread-safe objects in caseData.objectMap
  • Processing order is important - some tasks depend on results from previous tasks

Creating a Custom Task

Basic Structure

Extend AbstractTask and implement the required methods:
MyCustomTask.java

AbstractTask Class Reference

The AbstractTask class provides these key members:

Real-World Example: Hash Task

Let’s examine a simplified version of IPED’s HashTask:
HashTask.java

Configuration Support

Tasks can have custom configuration files:
1

Create Configuration Class

HashTaskConfig.java
2

Create Configuration File

HashTaskConfig.txt
3

Load in Task

Accessing Item Properties

IItem Interface

The IItem interface provides access to all item properties:

Modifying Items

Sharing Data Between Threads

Using CaseData

Share objects across all task instances:

Thread-Safe Collections

Use Java concurrent collections:

Processing Subitems

Tasks can create new items (e.g., carved files):

Checking Dependencies

Ensure required tasks are enabled:

Installing Your Task

1

Build JAR

Compile your task and package as JAR:
2

Install Plugin

Copy JAR to IPED plugins directory:
3

Register in TaskInstaller.xml

Best Practices

Place your task at the right point in the pipeline:
  • Before ParsingTask: If you need raw file content
  • After ParsingTask: If you need extracted text
  • After CategoryTask: If you need file categories
  • Before IndexTask: To ensure attributes are indexed
  • Cache expensive computations using hash values
  • Use item.getLength() to skip empty files
  • Check item.isDir() to skip directories
  • Use processIgnoredItem() = false to skip ignored files
  • Release resources in finish() method
  • Catch exceptions to prevent stopping entire pipeline
  • Log errors with LOGGER.error()
  • Set error attributes: item.setExtraAttribute("error", message)
  • Update statistics: stats.incErrors()
  • Test with small dataset first
  • Check TaskInstaller.xml order carefully
  • Verify shared objects are thread-safe
  • Test with multiple worker threads
  • Monitor memory usage with large batches

Task Execution Control

Enable/Disable Tasks

Process Ignored Items

Process Queue-End Markers

Next Steps

Scripting

Create tasks with JavaScript or Python

Web API

Access processed cases remotely