From 4235781f057646dd28bd53ab245695347a18d885 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Mon, 4 Mar 2024 19:22:38 +0100 Subject: [PATCH] Introduce include/exclude of A2 categories --- .../src/org/argeo/init/a2/A2Source.java | 3 +++ .../src/org/argeo/init/a2/FsA2Source.java | 17 +++++++++---- .../argeo/init/a2/ProvisioningManager.java | 25 ++++++++++++++----- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/org.argeo.init/src/org/argeo/init/a2/A2Source.java b/org.argeo.init/src/org/argeo/init/a2/A2Source.java index 5c8329c85..19134b784 100644 --- a/org.argeo.init/src/org/argeo/init/a2/A2Source.java +++ b/org.argeo.init/src/org/argeo/init/a2/A2Source.java @@ -14,5 +14,8 @@ public interface A2Source extends ProvisioningSource { final static String DEFAULT_A2_URI = SCHEME_A2 + ":///"; final static String DEFAULT_A2_REFERENCE_URI = SCHEME_A2_REFERENCE + ":///"; + final static String INCLUDE = "include"; + final static String EXCLUDE = "exclude"; + URI getUri(); } diff --git a/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java b/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java index 921992da3..acc553d7d 100644 --- a/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java +++ b/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java @@ -7,6 +7,7 @@ import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.StringJoiner; @@ -20,14 +21,16 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { private final Path base; private final Map variantsXOr; -// public FsA2Source(Path base) { -// this(base, new HashMap<>()); -// } + private final List includes; + private final List excludes; - public FsA2Source(Path base, Map variantsXOr, boolean usingReference) { + public FsA2Source(Path base, Map variantsXOr, boolean usingReference, List includes, + List excludes) { super(usingReference); this.base = base; this.variantsXOr = new HashMap<>(variantsXOr); + this.includes = includes; + this.excludes = excludes; } void load() throws IOException { @@ -85,8 +88,12 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { } } - for (Path contributionPath : contributions.keySet()) { + contributions: for (Path contributionPath : contributions.keySet()) { String contributionId = contributionPath.getFileName().toString(); + if (includes != null && !includes.contains(contributionId)) + continue contributions; + if (excludes != null && excludes.contains(contributionId)) + continue contributions; A2Contribution contribution = getOrAddContribution(contributionId); DirectoryStream modulePaths = Files.newDirectoryStream(contributionPath); modules: for (Path modulePath : modulePaths) { diff --git a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java index 289870abc..80006264c 100644 --- a/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java +++ b/org.argeo.init/src/org/argeo/init/a2/ProvisioningManager.java @@ -66,11 +66,19 @@ public class ProvisioningManager { // XOR Map> properties = queryToMap(u); Map xOr = new HashMap<>(); + List includes = null; + List excludes = null; for (String key : properties.keySet()) { List lst = properties.get(key); - if (lst.size() != 1) - throw new IllegalArgumentException("Invalid XOR definitions in " + uri); - xOr.put(key, lst.get(0)); + if (A2Source.INCLUDE.equals(key)) { + includes = new ArrayList<>(lst); + } else if (A2Source.EXCLUDE.equals(key)) { + excludes = new ArrayList<>(lst); + } else { + if (lst.size() != 1) + throw new IllegalArgumentException("Invalid XOR definitions in " + uri); + xOr.put(key, lst.get(0)); + } } if (SCHEME_A2.equals(u.getScheme()) || SCHEME_A2_REFERENCE.equals(u.getScheme())) { @@ -81,7 +89,8 @@ public class ProvisioningManager { } Path base = Paths.get(baseStr); if (Files.exists(base)) { - FsA2Source source = new FsA2Source(base, xOr, SCHEME_A2_REFERENCE.equals(u.getScheme())); + FsA2Source source = new FsA2Source(base, xOr, SCHEME_A2_REFERENCE.equals(u.getScheme()), + includes, excludes); source.load(); addSource(source); OsgiBootUtils.info("Registered " + uri + " as source"); @@ -91,7 +100,7 @@ public class ProvisioningManager { Path localLibBase = base.resolve(A2Contribution.LIB).resolve(localRelPath); if (Files.exists(localLibBase)) { FsA2Source libSource = new FsA2Source(localLibBase, xOr, - SCHEME_A2_REFERENCE.equals(u.getScheme())); + SCHEME_A2_REFERENCE.equals(u.getScheme()), includes, excludes); libSource.load(); addSource(libSource); OsgiBootUtils.info("Registered OS-specific " + uri + " as source (" + localRelPath + ")"); @@ -166,7 +175,11 @@ public class ProvisioningManager { // TODO make it more dynamic, based on OSGi APIs // TODO remove old module? Or keep update history? osgiContext.registerBundle(bundle); - OsgiBootUtils.info("Updated bundle " + bundle.getLocation() + " to version " + moduleVersion); + if (compare == 0) + OsgiBootUtils + .debug("Updated bundle " + bundle.getLocation() + " to same version " + moduleVersion); + else + OsgiBootUtils.info("Updated bundle " + bundle.getLocation() + " to version " + moduleVersion); return bundle; } else { if (OsgiBootUtils.isDebug()) -- 2.30.2