diff --git a/biz.aQute.bndlib/src/aQute/bnd/osgi/repository/BaseRepository.java b/biz.aQute.bndlib/src/aQute/bnd/osgi/repository/BaseRepository.java index 1baf34e565..1cfcfef450 100644 --- a/biz.aQute.bndlib/src/aQute/bnd/osgi/repository/BaseRepository.java +++ b/biz.aQute.bndlib/src/aQute/bnd/osgi/repository/BaseRepository.java @@ -36,8 +36,6 @@ public abstract class BaseRepository implements Repository, Tagged { private final PromiseFactory promiseFactory = new PromiseFactory( PromiseFactory.inlineExecutor()); - private static final String DEFAULT_TAG = "all"; - private static final Set DEFAULT_TAGS = Set.of(DEFAULT_TAG); static { Requirement requireAll = ResourceUtils.createWildcardRequirement(); @@ -250,6 +248,6 @@ public RequirementBuilder addAttribute(String name, Object value) { @Override public Set getTags() { - return DEFAULT_TAGS; + return Tagged.DEFAULT_REPO_TAGS; } } diff --git a/biz.aQute.bndlib/src/aQute/bnd/service/Registry.java b/biz.aQute.bndlib/src/aQute/bnd/service/Registry.java index 584f8fa003..c4cccf764f 100644 --- a/biz.aQute.bndlib/src/aQute/bnd/service/Registry.java +++ b/biz.aQute.bndlib/src/aQute/bnd/service/Registry.java @@ -1,6 +1,9 @@ package aQute.bnd.service; +import static aQute.bnd.service.Tagged.matchesTags; + import java.util.List; +import java.util.stream.Collectors; /** * A registry for objects. @@ -8,5 +11,16 @@ public interface Registry { List getPlugins(Class c); + default List getPlugins(Class c, String... tags) { + + if (tags == null || tags.length == 0) { + return getPlugins(c); + } + + return getPlugins(c).stream() + .filter(repo -> matchesTags(repo, tags)) + .collect(Collectors.toList()); + } + T getPlugin(Class c); } diff --git a/biz.aQute.bndlib/src/aQute/bnd/service/Tagged.java b/biz.aQute.bndlib/src/aQute/bnd/service/Tagged.java index d2ec0a1517..6f7e976635 100644 --- a/biz.aQute.bndlib/src/aQute/bnd/service/Tagged.java +++ b/biz.aQute.bndlib/src/aQute/bnd/service/Tagged.java @@ -1,9 +1,11 @@ package aQute.bnd.service; +import static aQute.bnd.service.Tagged.RepoTags.resolve; +import static java.util.stream.Collectors.toCollection; + import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; -import java.util.stream.Collectors; /** * Allows to add tags to implementing classes. Originally intended for tagging @@ -11,19 +13,48 @@ */ public interface Tagged { + + enum RepoTags { + /** + * tag for repos which should be used for Resolving bundles. This is + * also the default tag for all repos which not have specified tags + * (also for bc reasons) Also see {@link Tagged#DEFAULT_REPO_TAGS} + */ + resolve + // add more if neded e.g. relase, baseline + } + + /** + * Each repo has by default the tag {@link RepoTags#resolve} if not tags are + * set at the repo definition in build.bnd That means it is consider + */ + Set DEFAULT_REPO_TAGS = Set.of(resolve.name()); + /** * @return a non-null list of tags. */ Set getTags(); - static Set toTags(String csvTags) { + static Set toTags(String csvTags, Set defaultTags) { if (csvTags == null || csvTags.isBlank()) { - return Set.of("all"); // default + return defaultTags; // default } return Arrays.stream(csvTags.split(",")) .map(String::trim) - .collect(Collectors.toCollection(LinkedHashSet::new)); + .collect(toCollection(LinkedHashSet::new)); + } + + static boolean matchesTags(T obj, String... tags) { + if (obj instanceof Tagged tagged) { + Set taggedTags = tagged.getTags(); + for (String tag : tags) { + if (taggedTags.contains(tag)) { + return true; + } + } + } + return false; } } diff --git a/biz.aQute.bndlib/src/aQute/lib/deployer/FileRepo.java b/biz.aQute.bndlib/src/aQute/lib/deployer/FileRepo.java index 08d7f554c0..ec84a4cc35 100644 --- a/biz.aQute.bndlib/src/aQute/lib/deployer/FileRepo.java +++ b/biz.aQute.bndlib/src/aQute/lib/deployer/FileRepo.java @@ -1060,6 +1060,6 @@ public void setIndex(boolean b) { @Override public Set getTags() { - return Tagged.toTags(tags); + return Tagged.toTags(tags, Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/src/aQute/bnd/deployer/repository/LocalIndexedRepo.java b/biz.aQute.repository/src/aQute/bnd/deployer/repository/LocalIndexedRepo.java index 4aa7391b36..491557f16b 100644 --- a/biz.aQute.repository/src/aQute/bnd/deployer/repository/LocalIndexedRepo.java +++ b/biz.aQute.repository/src/aQute/bnd/deployer/repository/LocalIndexedRepo.java @@ -621,7 +621,7 @@ public void close() {} @Override public Set getTags() { - return Tagged.toTags(tags); + return Tagged.toTags(tags, Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/src/aQute/bnd/repository/maven/pom/provider/BndPomRepository.java b/biz.aQute.repository/src/aQute/bnd/repository/maven/pom/provider/BndPomRepository.java index 61814dcffc..58b86a1ed9 100644 --- a/biz.aQute.repository/src/aQute/bnd/repository/maven/pom/provider/BndPomRepository.java +++ b/biz.aQute.repository/src/aQute/bnd/repository/maven/pom/provider/BndPomRepository.java @@ -511,6 +511,6 @@ private Archive trySources(String bsn, Version version) throws Exception { @Override public Set getTags() { - return Tagged.toTags(configuration.tags()); + return Tagged.toTags(configuration.tags(), Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/src/aQute/bnd/repository/maven/provider/MavenBndRepository.java b/biz.aQute.repository/src/aQute/bnd/repository/maven/provider/MavenBndRepository.java index 1c7554b08c..79ea6aceef 100644 --- a/biz.aQute.repository/src/aQute/bnd/repository/maven/provider/MavenBndRepository.java +++ b/biz.aQute.repository/src/aQute/bnd/repository/maven/provider/MavenBndRepository.java @@ -1078,6 +1078,6 @@ public boolean isRemote() { @Override public Set getTags() { - return Tagged.toTags(configuration.tags()); + return Tagged.toTags(configuration.tags(), Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/src/aQute/bnd/repository/osgi/OSGiRepository.java b/biz.aQute.repository/src/aQute/bnd/repository/osgi/OSGiRepository.java index 2099f5ac33..7e9329de59 100644 --- a/biz.aQute.repository/src/aQute/bnd/repository/osgi/OSGiRepository.java +++ b/biz.aQute.repository/src/aQute/bnd/repository/osgi/OSGiRepository.java @@ -417,6 +417,6 @@ private void status(String s) { @Override public Set getTags() { - return Tagged.toTags(config.tags()); + return Tagged.toTags(config.tags(), Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/src/aQute/bnd/repository/p2/provider/P2Repository.java b/biz.aQute.repository/src/aQute/bnd/repository/p2/provider/P2Repository.java index 04e08f054c..e35bfea9bf 100644 --- a/biz.aQute.repository/src/aQute/bnd/repository/p2/provider/P2Repository.java +++ b/biz.aQute.repository/src/aQute/bnd/repository/p2/provider/P2Repository.java @@ -197,7 +197,7 @@ public String title(Object... target) throws Exception { @Override public Set getTags() { - return Tagged.toTags(config.tags()); + return Tagged.toTags(config.tags(), Tagged.DEFAULT_REPO_TAGS); } } diff --git a/biz.aQute.repository/test/aQute/bnd/repository/maven/provider/WorkspaceTest.java b/biz.aQute.repository/test/aQute/bnd/repository/maven/provider/WorkspaceTest.java index ff6813a434..95b760a8b3 100644 --- a/biz.aQute.repository/test/aQute/bnd/repository/maven/provider/WorkspaceTest.java +++ b/biz.aQute.repository/test/aQute/bnd/repository/maven/provider/WorkspaceTest.java @@ -1,17 +1,24 @@ package aQute.bnd.repository.maven.provider; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.File; +import java.util.ArrayList; import java.util.Formatter; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.osgi.service.repository.Repository; import aQute.bnd.build.Workspace; +import aQute.bnd.service.Tagged; +import aQute.bnd.service.Tagged.RepoTags; import aQute.bnd.test.jupiter.InjectTemporaryDirectory; import aQute.http.testservers.HttpTestServer.Config; import aQute.lib.io.IO; @@ -57,6 +64,37 @@ public void testEnv() throws Exception { assertNotNull(workspace); assertNotNull(repo); System.out.println(workspace.getBase()); + + // check repo tags + // repos should have the 'resolve' tag by default if no tag is specified + List repos = workspace.getPlugins(Repository.class); + List resolveRepos = workspace.getPlugins(Repository.class, RepoTags.resolve.name()); + assertEquals(repos, resolveRepos); + + Repository repo = repos.get(0); + assertTrue(repo instanceof Tagged); + assertEquals(1, ((Tagged) repo).getTags() + .size()); + assertEquals(RepoTags.resolve.name(), new ArrayList<>(((Tagged) repo).getTags()).get(0)); + + } + + @Test + public void testRepoWithDifferentTag() throws Exception { + // similar as testEnv() + // but override the tag with a different one and repeat the tests + config(Map.of("tags", "foo")); + + List resolveRepos = workspace.getPlugins(Repository.class, RepoTags.resolve.name()); + assertTrue(resolveRepos.isEmpty()); + + List repos = workspace.getPlugins(Repository.class); + Repository repo = repos.get(0); + assertTrue(repo instanceof Tagged); + assertEquals(1, ((Tagged) repo).getTags() + .size()); + assertEquals("foo", new ArrayList<>(((Tagged) repo).getTags()).get(0)); + } void config(Map override) throws Exception { @@ -74,7 +112,12 @@ void config(Map override) throws Exception { sb.format(" name=test; \\\n", MavenBndRepository.class.getName()); sb.format(" local=%s; \\\n", config.get("local")); sb.format(" releaseUrl=%s; \\\n", config.get("releaseUrl")); - sb.format(" index=%s\n", config.get("index")); + sb.format(" index=%s; \\\n", config.get("index")); + + String tags = config.get("tags"); + if (tags != null && !tags.isBlank()) { + sb.format(" tags=%s\n", tags); + } build.getParentFile() .mkdirs(); diff --git a/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java b/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java index e85c79603e..ae5e048e8b 100644 --- a/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java +++ b/biz.aQute.resolve/src/biz/aQute/resolve/BndrunResolveContext.java @@ -1,5 +1,7 @@ package biz.aQute.resolve; +import static aQute.bnd.service.Tagged.RepoTags.resolve; + import java.io.File; import java.io.InputStream; import java.net.URI; @@ -54,9 +56,7 @@ import aQute.bnd.service.Registry; import aQute.bnd.service.RepositoryPlugin; import aQute.bnd.service.Strategy; -import aQute.bnd.service.Tagged; import aQute.bnd.service.resolve.hook.ResolverHook; -import aQute.lib.collections.MultiMap; import aQute.lib.converter.Converter; import aQute.lib.strings.Strings; import aQute.lib.utf8properties.UTF8Properties; @@ -362,7 +362,6 @@ private Processor loadRepositories() throws Exception { // Map the repository names... - MultiMap reposTagMap = new MultiMap<>(); Map repoNameMap = new HashMap<>(allRepos.size()); for (Repository repo : allRepos) { String name; @@ -373,28 +372,14 @@ private Processor loadRepositories() throws Exception { } repoNameMap.put(name, repo); - // tags - if (repo instanceof Tagged taggedRepo) { - Set tags = taggedRepo.getTags(); - for (String tag : tags) { - reposTagMap.add(tag, repo); - } - } } // Create the result list orderedRepositories = new ArrayList<>(); for (String repoName : repoNames.keySet()) { - // tags prefixed with '@' e.g. '@baseline' - if (repoName.startsWith("@")) { - List repos = reposTagMap.get(repoName.substring(1)); - if (repos != null) - orderedRepositories.addAll(repos); - } else { - Repository repo = repoNameMap.get(repoName); - if (repo != null) - orderedRepositories.add(repo); - } + Repository repo = repoNameMap.get(repoName); + if (repo != null) + orderedRepositories.add(repo); } } @@ -420,12 +405,12 @@ private List getAllRepos() { List allRepos; if (project != null && !project.isStandalone()) { allRepos = project.getWorkspace() - .getPlugins(Repository.class); + .getPlugins(Repository.class, resolve.name()); allRepos.removeIf(WorkspaceRepositoryMarker.class::isInstance); WorkspaceResourcesRepository wr = new WorkspaceResourcesRepository(project.getWorkspace()); allRepos.add(wr); } else { - allRepos = registry.getPlugins(Repository.class); + allRepos = registry.getPlugins(Repository.class, resolve.name()); } return allRepos; } diff --git a/bndtools.core/_plugin.xml b/bndtools.core/_plugin.xml index 5b4acfedc7..a20e2fc9f0 100644 --- a/bndtools.core/_plugin.xml +++ b/bndtools.core/_plugin.xml @@ -839,7 +839,7 @@ helpUrl="https://bnd.bndtools.org/plugins/filerepo.html"> - + @@ -850,7 +850,7 @@ helpUrl="https://bnd.bndtools.org/plugins/osgirepo.html"> - + - + - + @@ -922,7 +922,7 @@ name="P2Repository" helpUrl="https://bnd.bndtools.org/plugins/p2repo.html"> - + @@ -932,7 +932,7 @@ name="Maven POM Repository" helpUrl="https://bnd.bndtools.org/plugins/pomrepo.html"> - + diff --git a/bndtools.core/src/bndtools/editor/project/RepositoriesEditModel.java b/bndtools.core/src/bndtools/editor/project/RepositoriesEditModel.java index 96be58a6e5..9f388fa754 100644 --- a/bndtools.core/src/bndtools/editor/project/RepositoriesEditModel.java +++ b/bndtools.core/src/bndtools/editor/project/RepositoriesEditModel.java @@ -1,5 +1,7 @@ package bndtools.editor.project; +import static aQute.bnd.service.Tagged.RepoTags.resolve; + import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -30,7 +32,7 @@ class RepositoriesEditModel { RepositoriesEditModel(BndEditModel model) { this.model = model; this.pluginOrder = model.getWorkspace() - .getPlugins(Repository.class); + .getPlugins(Repository.class, resolve.name()); this.standalone = model.getStandaloneLinks(); this.runrepos = model.getRunRepos(); this.ignoreStandalone = model.getIgnoreStandalone(); @@ -44,6 +46,7 @@ class RepositoriesEditModel { List remains = new ArrayList<>(pluginOrder); for (String name : runrepos) { + Repository r = find(name); if (r != null) { actualOrder.add(r); @@ -55,6 +58,7 @@ class RepositoriesEditModel { } } + private Repository find(String sought) { for (Repository r : pluginOrder) { String name = toName(r);