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              // DefaultStep#fine() removed in ndw/xmlcalabash1@ce9b07d
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  }