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.QName;
11  import net.sf.saxon.s9api.SaxonApiException;
12  import net.sf.saxon.s9api.XdmNode;
13  import nl.dedicon.pipeline.braille.step.JacketManager;
14  import nl.dedicon.pipeline.braille.step.Utils;
15  import org.daisy.common.xproc.calabash.XProcStepProvider;
16  import org.osgi.service.component.annotations.Component;
17  import org.slf4j.Logger;
18  import org.slf4j.LoggerFactory;
19  import org.w3c.dom.Document;
20  
21  /**
22   * XProc step for the jacket (the cover)
23   * 
24   * <level1> elements with class "flap" or "jacket_copy":
25   *  - will get the jacket-header, an existing header will become a paragraph (<p>)
26   *  - will be moved to the front
27   * 
28   * @author Paul Rambags
29   */
30  public class JacketStep extends DefaultStep {
31  
32      private static final Logger logger = LoggerFactory.getLogger(JacketStep.class);
33  
34      private static final QName _jacket_header = new QName("jacket-header");
35  
36      private ReadablePipe source = null;
37      private WritablePipe result = null;
38      
39      private JacketStep(XProcRuntime runtime, XAtomicStep step) {
40          super(runtime, step);
41      }
42  
43      @Override
44      public void setInput(String port, ReadablePipe pipe) {
45          source = pipe;
46      }
47  
48      @Override
49      public void setOutput(String port, WritablePipe pipe) {
50          result = pipe;
51      }
52  
53      @Override
54      public void reset() {
55          source.resetReader();
56          result.resetWriter();
57      }
58  
59      @Override
60      public void run() throws SaxonApiException {
61          
62          super.run();
63  
64          try {
65  
66              XdmNode book = source.read();
67              String header = getOption(_jacket_header, "");
68  
69              // convert the immutable XdmNode to a modifiable Document
70              Document document = Utils.convertToDocument(book);
71  
72              JacketManager jacketManager = new JacketManager();
73              
74              jacketManager.collect(document);
75              jacketManager.setHeader(header);
76              jacketManager.move();
77  
78              XdmNode newBook = Utils.convertToXdmNode(document, runtime.getProcessor().newDocumentBuilder(), true);
79              result.write(newBook);
80              
81          } catch (Exception e) {
82  
83              logger.error("dedicon:jacket failed", e);
84              throw new XProcException(step.getNode(), e);
85  
86          }
87      }
88  
89      @Component(
90              name = "dedicon:jacket",
91              service = {XProcStepProvider.class},
92              property = {"type:String={http://www.dedicon.nl}jacket"}
93      )
94      public static class Provider implements XProcStepProvider {
95  
96          @Override
97          public XProcStep newStep(XProcRuntime runtime, XAtomicStep step) {
98              return new JacketStep(runtime, step);
99          }
100 
101     }
102 }