1   package org.daisy.pipeline.common.calabash.impl;
2   
3   import java.util.Map;
4   import java.util.NoSuchElementException;
5   import java.util.function.Consumer;
6   
7   import javax.xml.namespace.QName;
8   import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
9   import javax.xml.stream.XMLStreamException;
10  import javax.xml.stream.XMLStreamReader;
11  
12  import com.google.common.collect.ImmutableMap;
13  
14  import org.daisy.common.transform.InputValue;
15  import org.daisy.common.transform.OutputValue;
16  import org.daisy.common.transform.TransformerException;
17  import org.daisy.common.transform.XMLInputValue;
18  import org.daisy.common.transform.XMLTransformer;
19  import org.daisy.common.xproc.XProcError;
20  
21  public class ErrorReporter implements XMLTransformer {
22  
23  	private final static QName _SOURCE = new QName("source");
24  	private static final QName C_ERROR = new QName("http://www.w3.org/ns/xproc-step", "error");
25  
26  	private final Consumer<XProcError> reporter;
27  
28  	ErrorReporter(Consumer<XProcError> reporter) {
29  		this.reporter = reporter;
30  	}
31  
32  	@Override
33  	public Runnable transform(Map<QName,InputValue<?>> input, Map<QName,OutputValue<?>> output) {
34  		input = XMLTransformer.validateInput(input, ImmutableMap.of(_SOURCE, InputType.MANDATORY_NODE_SEQUENCE));
35  		output = XMLTransformer.validateOutput(output, null);
36  		XMLInputValue<?> source = (XMLInputValue<?>)input.get(_SOURCE);
37  		return () -> report(source.asXMLStreamReader());
38  	}
39  
40  	private void report(XMLStreamReader reader) throws TransformerException {
41  		try {
42  			while (true)
43  				try {
44  					int event = reader.next();
45  					switch (event) {
46  					case START_ELEMENT:
47  						if (C_ERROR.equals(reader.getName())) {
48  							XProcError xprocError = XProcError.parse(reader);
49  							reporter.accept(xprocError);
50  						}
51  						break;
52  					default:
53  					}
54  				} catch (NoSuchElementException e) {
55  					break;
56  				}
57  		} catch (XMLStreamException e) {
58  			throw new TransformerException(e);
59  		}
60  	}
61  }