1 package org.daisy.pipeline.braille.common.calabash.impl; 2 3 import java.util.Map; 4 5 import com.xmlcalabash.core.XProcRuntime; 6 import com.xmlcalabash.io.WritablePipe; 7 import com.xmlcalabash.library.DefaultStep; 8 import com.xmlcalabash.runtime.XAtomicStep; 9 10 import net.sf.saxon.s9api.QName; 11 import net.sf.saxon.s9api.SaxonApiException; 12 13 import org.daisy.common.xproc.calabash.XProcStep; 14 import org.daisy.common.xproc.calabash.XProcStepProvider; 15 import org.daisy.common.xproc.calabash.XMLCalabashOptionValue; 16 import org.daisy.common.xproc.calabash.XMLCalabashOutputValue; 17 import org.daisy.common.xproc.XProcMonitor; 18 import static org.daisy.pipeline.braille.common.Query.util.query; 19 import static org.daisy.pipeline.braille.common.Query.util.marshallQuery; 20 21 import org.osgi.service.component.annotations.Component; 22 23 public class PxParseQueryStep extends DefaultStep implements XProcStep { 24 25 @Component( 26 name = "px:parse-query", 27 service = { XProcStepProvider.class }, 28 property = { "type:String={http://www.daisy.org/ns/pipeline/xproc}parse-query" } 29 ) 30 public static class StepProvider implements XProcStepProvider { 31 @Override 32 public XProcStep newStep(XProcRuntime runtime, XAtomicStep step, XProcMonitor monitor, Map<String,String> properties) { 33 return new PxParseQueryStep(runtime, step); 34 } 35 } 36 37 private WritablePipe result = null; 38 private static final QName _QUERY = new QName("query"); 39 40 private PxParseQueryStep(XProcRuntime runtime, XAtomicStep step) { 41 super(runtime, step); 42 } 43 44 @Override 45 public void setOutput(String port, WritablePipe pipe) { 46 result = pipe; 47 } 48 49 @Override 50 public void reset() { 51 result.resetWriter(); 52 } 53 54 @Override 55 public void run() throws SaxonApiException { 56 try { 57 marshallQuery(query(new XMLCalabashOptionValue(getOption(_QUERY)).toString()), 58 new XMLCalabashOutputValue(result, runtime).asXMLStreamWriter()); 59 } catch (Throwable e) { 60 throw XProcStep.raiseError(e, step); 61 } 62 super.run(); 63 } 64 }