Package edu.illinois.ncsa.daffodil.japi

Provides the classes necessary to compile DFDL schemas, parse and unparse files using the compiled objects, and retrieve results and parsing diagnostics

See: Description

Package edu.illinois.ncsa.daffodil.japi Description

Provides the classes necessary to compile DFDL schemas, parse and unparse files using the compiled objects, and retrieve results and parsing diagnostics

Overview

The main class to use is Daffodil to create a Compiler:
 Compiler c = Daffodil.compiler();
 
This can then be used to compiled a DFDL schema, and generate a ProcessorFactory:
 ProcessorFactor pf = c.compile(files);
 
This can then be used to create a DataProcessor:
 DataProcessor dp = pf.onPath("/");
 
This can then be used to parse data, returning a ParseResult, which contains the DFDL infoset in the form of a jdom2 document:
 ParseResult pr = dp.parse(data);
 org.jdom2.Document infoset = pr.result();
 
The DataProcessor.parse(java.nio.channels.ReadableByteChannel) method may be called multiple times without the need to create another data processors. For example:
 for (File f : inputFiles) {
   ParseResult pr = dp.parse(f);
   org.jdom2.Document infoset = pr.result();
 }
 

Failures & Diagnostics

It is possible that failures could occur during the creation of the ProcessorFactory, DataProcessor, or ParseResult. However, rather than throwing an exception on error (e.g. invalid DFDL schema, parse error, etc), these classes extend WithDiagnostics, which is used to determine if an error occured, and any diagnostic information (see Diagnostic) related to the step. thus, before contining, one must check WithDiagnostics.isError(). For example:
 ProcessorFactor pf = c.compile(files);
 if (pf.isError()) {
   java.util.List<Diagnostic> diags = pf.getDiagnostics();
   foreach (Diagnostic d : diags) {
     System.out.println(d.toString());
   }
   return -1;
 }
 

Saving & Reloading Parsers

In some cases, it may be beneficial to save a parser and reload it. For example, when starting up, it may be quicker to reload an already compiled parser than to compile it from scratch. To save a DataProcessor:
 DataProcessor dp = pf.onPath("/");
 dp.save(saveFile);
 
And to restore a saved DataProcessor:
 DataProcessor dp = Daffodil.reload(saveFile);
 ParseResult pr = dp.parse(data);