1   package nl.dedicon.pipeline.braille.calabash.impl;
2   
3   import com.xmlcalabash.core.XProcException;
4   import com.xmlcalabash.core.XProcRuntime;
5   import com.xmlcalabash.core.XProcStep;
6   import com.xmlcalabash.io.ReadablePipe;
7   import com.xmlcalabash.io.WritablePipe;
8   import com.xmlcalabash.library.DefaultStep;
9   import com.xmlcalabash.runtime.XAtomicStep;
10  import net.sf.saxon.s9api.SaxonApiException;
11  import net.sf.saxon.s9api.XdmNode;
12  import nl.dedicon.pipeline.braille.step.NotesMover;
13  import nl.dedicon.pipeline.braille.step.Utils;
14  import org.daisy.common.xproc.calabash.XProcStepProvider;
15  import org.osgi.service.component.annotations.Component;
16  import org.slf4j.Logger;
17  import org.slf4j.LoggerFactory;
18  import org.w3c.dom.Document;
19  
20  /**
21   * XProc step for moving notes
22   * 
23   * Notes are moved right after the parent of the corresponding noteref element
24   * 
25   * @author Paul Rambags
26   */
27  public class MoveNotesStep extends DefaultStep {
28  
29      private static final Logger logger = LoggerFactory.getLogger(MoveNotesStep.class);
30  
31      private ReadablePipe source = null;
32      private WritablePipe result = null;
33      
34      private MoveNotesStep(XProcRuntime runtime, XAtomicStep step) {
35          super(runtime, step);
36      }
37  
38      @Override
39      public void setInput(String port, ReadablePipe pipe) {
40          source = pipe;
41      }
42  
43      @Override
44      public void setOutput(String port, WritablePipe pipe) {
45          result = pipe;
46      }
47  
48      @Override
49      public void reset() {
50          source.resetReader();
51          result.resetWriter();
52      }
53  
54      @Override
55      public void run() throws SaxonApiException {
56          
57          super.run();
58  
59          try {
60  
61              XdmNode book = source.read();
62  
63              // convert the immutable XdmNode to a modifiable Document
64              Document document = Utils.convertToDocument(book);
65  
66              NotesMover notesMover = new NotesMover();
67              
68              notesMover.collectNotesAndNoterefs(document);
69              notesMover.moveNotes();
70  
71              XdmNode newBook = Utils.convertToXdmNode(document, runtime.getProcessor().newDocumentBuilder(), true);
72  
73              result.write(newBook);
74              
75          } catch (Exception e) {
76  
77              logger.error("dedicon:move-notes failed", e);
78              throw new XProcException(step.getNode(), e);
79  
80          }
81      }
82  
83      @Component(
84              name = "dedicon:move-notes",
85              service = {XProcStepProvider.class},
86              property = {"type:String={http://www.dedicon.nl}move-notes"}
87      )
88      public static class Provider implements XProcStepProvider {
89  
90          @Override
91          public XProcStep newStep(XProcRuntime runtime, XAtomicStep step) {
92              return new MoveNotesStep(runtime, step);
93          }
94  
95      }
96  }