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 }