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  }