1 package org.daisy.pipeline.file.saxon.impl; 2 3 import net.sf.saxon.expr.XPathContext; 4 import net.sf.saxon.lib.ExtensionFunctionCall; 5 import net.sf.saxon.lib.ExtensionFunctionDefinition; 6 import net.sf.saxon.om.AtomicSequence; 7 import net.sf.saxon.om.Sequence; 8 import net.sf.saxon.om.StructuredQName; 9 import net.sf.saxon.trans.XPathException; 10 import net.sf.saxon.type.BuiltInAtomicType; 11 import net.sf.saxon.value.SequenceType; 12 import net.sf.saxon.value.StringValue; 13 14 import static org.daisy.pipeline.file.FileUtils.expand83; 15 16 import org.osgi.service.component.annotations.Component; 17 18 @Component( 19 name = "pf:file-expand83", 20 service = { ExtensionFunctionDefinition.class } 21 ) 22 @SuppressWarnings("serial") 23 public class Expand83 extends ExtensionFunctionDefinition { 24 25 private static final StructuredQName funcname = new StructuredQName("pf", 26 "http://www.daisy.org/ns/pipeline/functions", "file-expand83"); 27 28 @Override 29 public SequenceType[] getArgumentTypes() { 30 return new SequenceType[] { SequenceType.SINGLE_STRING }; 31 } 32 33 @Override 34 public StructuredQName getFunctionQName() { 35 return funcname; 36 } 37 38 @Override 39 public SequenceType getResultType(SequenceType[] arg0) { 40 return SequenceType.SINGLE_STRING; 41 } 42 43 @Override 44 public ExtensionFunctionCall makeCallExpression() { 45 return new ExtensionFunctionCall() { 46 @Override 47 public Sequence call(XPathContext context, Sequence[] arguments) 48 throws XPathException { 49 String uri = ((AtomicSequence) arguments[0]).getStringValue(); 50 try { 51 uri = expand83(uri); 52 } catch (Throwable e) { 53 throw new XPathException("Unexpected error in pf:file-expand83("+uri+")", e); 54 } 55 return new StringValue(uri, BuiltInAtomicType.STRING); 56 } 57 }; 58 } 59 }