1   package org.daisy.pipeline.braille.pef;
2   
3   import java.util.ArrayList;
4   import java.util.Collection;
5   import java.util.List;
6   
7   import org.daisy.dotify.api.factory.FactoryProperties;
8   import org.daisy.dotify.api.table.Table;
9   
10  import org.daisy.pipeline.braille.common.Provider;
11  import static org.daisy.pipeline.braille.common.Provider.util.dispatch;
12  import org.daisy.pipeline.braille.common.Provider.util.Memoize;
13  import org.daisy.pipeline.braille.common.Query;
14  
15  import org.osgi.service.component.annotations.Component;
16  import org.osgi.service.component.annotations.Reference;
17  import org.osgi.service.component.annotations.ReferenceCardinality;
18  import org.osgi.service.component.annotations.ReferencePolicy;
19  
20  @Component(
21  	name = "table-registry",
22  	service = { TableRegistry.class }
23  )
24  public class TableRegistry extends Memoize<Query,Table> implements TableProvider {
25  	
26  	private List<TableProvider> providers = new ArrayList<>();
27  	private Provider<Query,Table> dispatch = dispatch(providers);
28  	
29  	@Reference(
30  		name = "TableProvider",
31  		unbind = "-",
32  		service = TableProvider.class,
33  		cardinality = ReferenceCardinality.MULTIPLE,
34  		policy = ReferencePolicy.STATIC
35  	)
36  	public void addProvider(TableProvider p) {
37  		providers.add(p);
38  	}
39  
40  	@Override
41  	public Iterable<Table> _get(Query q) {
42  		return dispatch.get(q);
43  	}
44  
45  	@Override
46  	public Collection<FactoryProperties> list() {
47  		List<FactoryProperties> list = new ArrayList<>();
48  		for (TableProvider p : providers)
49  			list.addAll(p.list());
50  		return list;
51  	}
52  
53  	@Override
54  	public Table newFactory(String identifier) {
55  		for (TableProvider p : providers) {
56  			Table t = p.newFactory(identifier);
57  			if (t != null)
58  				return t;
59  		}
60  		return null;
61  	}
62  }