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 }