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
23
24
25
26
27
28
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
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 }