package aQute.bnd.deployer.repository.wrapper; import java.io.Closeable; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import org.osgi.resource.Capability; import org.osgi.resource.Requirement; import org.osgi.service.repository.Repository; import aQute.bnd.build.Workspace; import aQute.bnd.osgi.Processor; import aQute.bnd.osgi.repository.BaseRepository; import aQute.bnd.osgi.resource.FilterParser; import aQute.bnd.service.Registry; import aQute.bnd.service.RegistryPlugin; import aQute.bnd.service.repository.InfoRepository; import aQute.lib.collections.MultiMap; import aQute.lib.converter.Converter; import aQute.lib.exceptions.Exceptions; import aQute.lib.io.IO; import aQute.libg.reporter.ReporterAdapter; import aQute.service.reporter.Reporter; public class Plugin extends BaseRepository implements aQute.bnd.service.Plugin, RegistryPlugin, Repository, Closeable { private Registry registry; private Config config; private Reporter reporter = new ReporterAdapter(); private File dir; private InfoRepositoryWrapper wrapper; private boolean init = false; interface Config { String location(); boolean reindex(); String augments(); } public void setRegistry(Registry registry) { this.registry = registry; } public void setProperties(Map<String,String> map) throws Exception { config = Converter.cnv(Config.class, map); File file = IO.getFile(config.location()); IO.mkdirs(file); if (!file.isDirectory()) { reporter.error("Repository Wrapper: cannot create cache: %s", file); } this.dir = file; } public void setReporter(Reporter reporter) { this.reporter = reporter; } /** * This is called when all initialization is done for the plugins, now we * can obtain a list of appropriate repos. */ public void init() { if (init) return; init = true; try { // // Get the list if repos registered, repos that we can handle // List<InfoRepository> irs = new ArrayList<InfoRepository>(); for (InfoRepository ir : registry.getPlugins(InfoRepository.class)) { irs.add(ir); } this.wrapper = new InfoRepositoryWrapper(dir, irs); if (config.reindex()) this.wrapper.clear(); // An augment file was specified, this specifies extra // reqs and caps for the analyzed files // if (config.augments() != null) { Workspace workspace = registry.getPlugin(Workspace.class); try (Processor p = new Processor(workspace)) { if (!config.augments().equals("WORKSPACE")) { File f = IO.getFile(workspace.getBuildDir(), config.augments()); if (!f.isFile()) { if (reporter != null) reporter.error("No augment file found at %s", f.getAbsolutePath()); return; } // // We read this in a processor that extends the // workspace so // we // can use workspace properties // p.setProperties(f); this.wrapper.clear(f.lastModified()); } // // And then add it to the indexer to use. // this.wrapper.addAugment(p.getFlattenedProperties()); this.wrapper.clear(workspace.getPropertiesFile().lastModified()); } } } catch (Exception e) { throw Exceptions.duck(e); } } public void close() throws java.io.IOException { if (this.wrapper == null) { return; } this.wrapper.close(); } FilterParser fp = new FilterParser(); @SuppressWarnings({ "unchecked", "rawtypes" }) public Map<Requirement,Collection<Capability>> findProviders(Collection< ? extends Requirement> requirements) { init(); MultiMap<Requirement,Capability> result = new MultiMap<Requirement,Capability>(); try { wrapper.findProviders(result, requirements); } catch (Exception e) { throw new RuntimeException(e); } return (Map) result; } public String toString() { return wrapper != null ? wrapper.toString() : "<wrapper not set>"; } }