1   package org.daisy.pipeline.braille.dotify.impl;
2   
3   import java.net.URI;
4   import java.util.Map;
5   
6   import com.google.common.base.MoreObjects;
7   import com.google.common.base.MoreObjects.ToStringHelper;
8   
9   import com.xmlcalabash.core.XProcRuntime;
10  import com.xmlcalabash.runtime.XAtomicStep;
11  
12  import org.daisy.common.file.URLs;
13  import org.daisy.common.xproc.calabash.XProcStep;
14  import org.daisy.common.xproc.calabash.XProcStepProvider;
15  import org.daisy.common.xproc.XProcMonitor;
16  import org.daisy.pipeline.braille.common.AbstractTransform;
17  import org.daisy.pipeline.braille.common.AbstractTransformProvider;
18  import org.daisy.pipeline.braille.common.AbstractTransformProvider.util.Iterables;
19  import org.daisy.pipeline.braille.common.calabash.CxEvalBasedTransformer;
20  import static org.daisy.pipeline.braille.common.AbstractTransformProvider.util.logCreate;
21  import org.daisy.pipeline.braille.common.Query;
22  import org.daisy.pipeline.braille.common.Query.Feature;
23  import org.daisy.pipeline.braille.common.Query.MutableQuery;
24  import static org.daisy.pipeline.braille.common.Query.util.mutableQuery;
25  import org.daisy.pipeline.braille.common.Transform;
26  import org.daisy.pipeline.braille.common.TransformProvider;
27  
28  import org.osgi.service.component.annotations.Activate;
29  import org.osgi.service.component.annotations.Component;
30  
31  public interface DotifyOBFLTransform {
32  	
33  	@Component(
34  		name = "org.daisy.pipeline.braille.dotify.impl.DotifyOBFLTransform.Provider",
35  		service = {
36  			TransformProvider.class
37  		}
38  	)
39  	public class Provider extends AbstractTransformProvider<Transform> {
40  		
41  		private URI href;
42  		
43  		@Activate
44  		protected void activate(final Map<?,?> properties) {
45  			href = URLs.asURI(URLs.getResourceFromJAR("xml/transform/obfl-to-pef.xpl", DotifyOBFLTransform.class));
46  		}
47  		
48  		private final static Iterable<Transform> empty = Iterables.<Transform>empty();
49  		
50  		protected Iterable<Transform> _get(Query query) {
51  			try {
52  				MutableQuery q = mutableQuery(query);
53  				boolean obfl = false;
54  				for (Feature f : q.removeAll("input")) {
55  					String i = f.getValue().get();
56  					if ("obfl".equals(i))
57  						obfl = true;
58  					else if (!"text-css".equals(i))
59  						return empty; }
60  				if (!obfl)
61  					return empty;
62  				for (Feature f : q.removeAll("output"))
63  					if (!("pef".equals(f.getValue().get()) || "braille".equals(f.getValue().get())))
64  						return empty;
65  				if (!q.isEmpty())
66  					return empty;
67  				return Iterables.<Transform>of(
68  					logCreate((Transform)new TransformImpl())); }
69  			catch (IllegalStateException e) {}
70  			return empty;
71  		}
72  		
73  		private class TransformImpl extends AbstractTransform implements XProcStepProvider {
74  			
75  			private TransformImpl() {
76  			}
77  			
78  			@Override
79  			public XProcStep newStep(XProcRuntime runtime, XAtomicStep step, XProcMonitor monitor, Map<String,String> properties) {
80  				return new CxEvalBasedTransformer(href, null, null).newStep(runtime, step, monitor, properties);
81  			}
82  			
83  			@Override
84  			public ToStringHelper toStringHelper() {
85  				return MoreObjects.toStringHelper("DotifyOBFLTransform$Provider$TransformImpl");
86  			}
87  		}
88  		
89  		@Override
90  		public ToStringHelper toStringHelper() {
91  			return MoreObjects.toStringHelper("DotifyOBFLTransform$Provider");
92  		}
93  	}
94  }