package bndtools.model.repo; import java.io.File; import java.net.URI; import java.text.MessageFormat; import java.util.Collections; import org.bndtools.api.ILogger; import org.bndtools.api.Logger; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Path; import aQute.bnd.service.RemoteRepositoryPlugin; import aQute.bnd.service.RepositoryPlugin; import aQute.bnd.service.ResourceHandle; import aQute.bnd.service.ResourceHandle.Location; import aQute.bnd.service.Strategy; import aQute.bnd.version.Version; abstract class VersionFinder { String versionSpec; Strategy strategy; VersionFinder(String versionSpec, Strategy strategy) { this.versionSpec = versionSpec; this.strategy = strategy; } abstract Version findVersion() throws Exception; @Override public String toString() { return versionSpec; } } public abstract class RepositoryEntry implements IAdaptable { private static final ILogger logger = Logger.getLogger(RepositoryEntry.class); private final RepositoryPlugin repo; private final String bsn; private final VersionFinder versionFinder; protected RepositoryEntry(RepositoryPlugin repo, String bsn, VersionFinder versionFinder) { this.repo = repo; this.bsn = bsn; this.versionFinder = versionFinder; } public final RepositoryPlugin getRepo() { return repo; } public final String getBsn() { return bsn; } @Override public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { // Avoid getting the file if the requested adapter type is not supported. boolean adaptable = IFile.class.equals(adapter) || File.class.equals(adapter) || URI.class.equals(adapter); if (!adaptable) return null; if (IFile.class.equals(adapter)) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); File file = getFile(false); return file != null ? root.getFileForLocation(new Path(file.getAbsolutePath())) : null; } if (File.class.equals(adapter)) return getFile(false); if (URI.class.equals(adapter)) { File file = getFile(false); return file != null ? file.toURI() : null; } return null; } public final boolean isLocal() { boolean result = true; try { if (repo instanceof RemoteRepositoryPlugin) { ResourceHandle handle = ((RemoteRepositoryPlugin) repo).getHandle(bsn, versionFinder.versionSpec, versionFinder.strategy, Collections.<String, String> emptyMap()); Location location = handle.getLocation(); result = location == Location.local || location == Location.remote_cached; } } catch (Exception e) { logger.logError(MessageFormat.format("Failed to query repository {0} for bundle {1} version {2}.", repo.getName(), bsn, versionFinder), e); } return result; } public final File getFile(boolean forceDownload) { File result; try { if (repo instanceof RemoteRepositoryPlugin) { ResourceHandle handle = ((RemoteRepositoryPlugin) repo).getHandle(bsn, versionFinder.versionSpec, versionFinder.strategy, Collections.<String, String> emptyMap()); switch (handle.getLocation()) { case local : case remote_cached : result = handle.request(); break; default : result = forceDownload ? handle.request() : null; } } else { Version version = versionFinder.findVersion(); result = (version != null) ? repo.get(bsn, version, Collections.<String, String> emptyMap()) : null; } return result; } catch (Exception e) { logger.logError(MessageFormat.format("Failed to query repository {0} for bundle {1} version {2}.", repo.getName(), bsn, versionFinder), e); return null; } } }