public DocumentProcessor.Progress process(Processing processing) {
        processing.setServiceName(getName());
        if (processing.callStack() == null) {
            ((ProcessingAccess)processing).setCallStack(new CallStack(getCallStack()));
        }

        DocumentProcessor.Progress progress = DocumentProcessor.Progress.DONE;
        //metrics stuff:
        //TODO: Note that this is *wrong* in case of Progress.LATER, documents are then counted several times until the Processing is DONE or FAILED.
        incrementNumDocsProcessed(processing);
        do {
            Call call = processing.callStack().pop();
            if (call == null) {
                // No more processors - done
                return progress;
            }

            //might throw exception, which is OK:
            progress = call.call(processing);

            if (log.isLoggable(Level.FINEST)) {
                logProgress(processing, progress, call);
            }

            if (DocumentProcessor.Progress.LATER.equals(progress)) {
                processing.callStack().addNext(call);
                return progress;
            }
        } while (DocumentProcessor.Progress.DONE.equals(progress));
        return progress;
    }
Processes a given Processing through the CallStack of this executor.

@param processing the Processing to process. The CallStack of the Processing will be set to a clone of the CallStack of this executor, iff. it is currently null.
@return a Progress; if this is LATER, the Processing is not done and must be reprocessed later.
@throws RuntimeException if a document processor throws an exception during processing.
@see com.yahoo.docproc.Processing
docproc/src/main/java/com/yahoo/docproc/impl/DocprocExecutor.java