1 package nl.dedicon.pipeline.braille.calabash.impl;
2
3 import net.sf.saxon.s9api.QName;
4 import net.sf.saxon.s9api.SaxonApiException;
5 import com.xmlcalabash.core.XProcRuntime;
6 import com.xmlcalabash.core.XProcStep;
7 import com.xmlcalabash.io.ReadablePipe;
8 import com.xmlcalabash.io.WritablePipe;
9 import com.xmlcalabash.library.DefaultStep;
10 import com.xmlcalabash.runtime.XAtomicStep;
11 import net.sf.saxon.s9api.XdmNode;
12 import nl.dedicon.pipeline.braille.step.MessageContainer;
13 import org.daisy.common.xproc.calabash.XProcStepProvider;
14 import org.osgi.service.component.annotations.Component;
15
16 public class MessageStep extends DefaultStep {
17
18 private static final QName _message = new QName("message");
19 private static final QName _severity = new QName("severity");
20 private static final QName _reset = new QName("reset");
21
22 private static final MessageContainer messageContainer = new MessageContainer();
23
24 private ReadablePipe source = null;
25 private WritablePipe result = null;
26
27 private MessageStep(XProcRuntime runtime, XAtomicStep step) {
28 super(runtime, step);
29 }
30
31 @Override
32 public void setInput(String port, ReadablePipe pipe) {
33 source = pipe;
34 }
35
36 @Override
37 public void setOutput(String port, WritablePipe pipe) {
38 result = pipe;
39 }
40
41 @Override
42 public void reset() {
43 source.resetReader();
44 result.resetWriter();
45 }
46
47 @Override
48 public void run() throws SaxonApiException {
49 super.run();
50
51 XdmNode node = source.read();
52 if (node != null) {
53 result.write(node);
54 }
55
56 String severity = getOption(_severity, "INFO");
57 String message = getOption(_message, (String)null);
58 boolean reset = getOption(_reset, false);
59
60 if (reset) {
61 messageContainer.reset();
62 }
63
64 message = messageContainer.getElapsedTime().concat(" ").concat(message);
65
66 if ("WARN".equals(severity)) {
67 warning(this.step.getNode(), message);
68 } else if ("DEBUG".equals(severity)) {
69
70 this.runtime.getMessageListener().fine(this,this.step.getNode(), message);
71 } else {
72 info(this.step.getNode(), message);
73 }
74 }
75
76 @Component(
77 name = "dedicon:message",
78 service = {XProcStepProvider.class},
79 property = {"type:String={http://www.dedicon.nl}message"}
80 )
81 public static class Provider implements XProcStepProvider {
82
83 @Override
84 public XProcStep newStep(XProcRuntime runtime, XAtomicStep step) {
85 return new MessageStep(runtime, step);
86 }
87 }
88 }