From 8e83ad78ea94ce72672b535ab421bb68b6b3bae3 Mon Sep 17 00:00:00 2001 From: Mathieu Date: Sun, 20 Nov 2022 11:43:35 +0100 Subject: [PATCH] Improve A2 --- Makefile-rcp.mk | 1 - org.argeo.api.cms/bnd.bnd | 1 + .../init/a2/AbstractProvisioningSource.java | 33 +++++++++++-------- .../src/org/argeo/init/a2/FsA2Source.java | 26 +++++++++++---- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/Makefile-rcp.mk b/Makefile-rcp.mk index d534e2f96..29f1a23a3 100644 --- a/Makefile-rcp.mk +++ b/Makefile-rcp.mk @@ -21,7 +21,6 @@ osgi/api/org.argeo.tp.osgi \ swt/rcp/org.argeo.tp.swt \ lib/linux/x86_64/swt/rcp/org.argeo.tp.swt \ swt/rcp/org.argeo.tp.swt.workbench \ -org.argeo.tp.jcr clean: diff --git a/org.argeo.api.cms/bnd.bnd b/org.argeo.api.cms/bnd.bnd index 351748484..36cde6410 100644 --- a/org.argeo.api.cms/bnd.bnd +++ b/org.argeo.api.cms/bnd.bnd @@ -1,4 +1,5 @@ Import-Package: \ +javax.transaction.xa,\ javax.security.*,\ org.osgi.service.useradmin,\ diff --git a/org.argeo.init/src/org/argeo/init/a2/AbstractProvisioningSource.java b/org.argeo.init/src/org/argeo/init/a2/AbstractProvisioningSource.java index 7df851b24..617e78878 100644 --- a/org.argeo.init/src/org/argeo/init/a2/AbstractProvisioningSource.java +++ b/org.argeo.init/src/org/argeo/init/a2/AbstractProvisioningSource.java @@ -28,10 +28,10 @@ import org.osgi.framework.Version; public abstract class AbstractProvisioningSource implements ProvisioningSource { protected final Map contributions = Collections.synchronizedSortedMap(new TreeMap<>()); - private final boolean useReference; + private final boolean usingReference; - public AbstractProvisioningSource(boolean useReference) { - this.useReference = useReference; + public AbstractProvisioningSource(boolean usingReference) { + this.usingReference = usingReference; } public Iterable listContributions(Object filter) { @@ -42,7 +42,7 @@ public abstract class AbstractProvisioningSource implements ProvisioningSource { public Bundle install(BundleContext bc, A2Module module) { try { Object locator = module.getLocator(); - if (useReference && locator instanceof Path locatorPath) { + if (usingReference && locator instanceof Path locatorPath) { String referenceUrl = "reference:file:" + locatorPath.toString(); Bundle bundle = bc.installBundle(referenceUrl); return bundle; @@ -69,7 +69,7 @@ public abstract class AbstractProvisioningSource implements ProvisioningSource { public void update(Bundle bundle, A2Module module) { try { Object locator = module.getLocator(); - if (useReference && locator instanceof Path) { + if (usingReference && locator instanceof Path) { try (InputStream in = newInputStream(locator)) { bundle.update(in); } @@ -196,6 +196,20 @@ public abstract class AbstractProvisioningSource implements ProvisioningSource { return symbolicName; } + protected boolean isUsingReference() { + return usingReference; + } + + private InputStream newInputStream(Object locator) throws IOException { + if (locator instanceof Path) { + return Files.newInputStream((Path) locator); + } else if (locator instanceof URL) { + return ((URL) locator).openStream(); + } else { + throw new IllegalArgumentException("Unsupported module locator type " + locator.getClass()); + } + } + private static Manifest findManifest(Path currentPath) { Path metaInfPath = currentPath.resolve("META-INF"); if (Files.exists(metaInfPath) && Files.isDirectory(metaInfPath)) { @@ -241,13 +255,4 @@ public abstract class AbstractProvisioningSource implements ProvisioningSource { } - private InputStream newInputStream(Object locator) throws IOException { - if (locator instanceof Path) { - return Files.newInputStream((Path) locator); - } else if (locator instanceof URL) { - return ((URL) locator).openStream(); - } else { - throw new IllegalArgumentException("Unsupported module locator type " + locator.getClass()); - } - } } 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 d4aa86386..e0e2e437f 100644 --- a/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java +++ b/org.argeo.init/src/org/argeo/init/a2/FsA2Source.java @@ -9,6 +9,7 @@ import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import java.util.SortedMap; +import java.util.StringJoiner; import java.util.TreeMap; import org.argeo.init.osgi.OsgiBootUtils; @@ -17,16 +18,16 @@ import org.osgi.framework.Version; /** A file system {@link AbstractProvisioningSource} in A2 format. */ public class FsA2Source extends AbstractProvisioningSource implements A2Source { private final Path base; - private final Map xOr; + private final Map variantsXOr; // public FsA2Source(Path base) { // this(base, new HashMap<>()); // } - public FsA2Source(Path base, Map xOr, boolean useReference) { - super(useReference); + public FsA2Source(Path base, Map variantsXOr, boolean usingReference) { + super(usingReference); this.base = base; - this.xOr = new HashMap<>(xOr); + this.variantsXOr = new HashMap<>(variantsXOr); } void load() throws IOException { @@ -44,7 +45,7 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { } else {// variants Path variantPath = null; // is it an explicit variant? - String variant = xOr.get(contributionPath.getFileName().toString()); + String variant = variantsXOr.get(contributionPath.getFileName().toString()); if (variant != null) { variantPath = contributionPath.resolve(variant); } @@ -119,7 +120,16 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { URI baseUri = base.toUri(); try { if (baseUri.getScheme().equals("file")) { - return new URI(SCHEME_A2, null, base.toString(), null); + String queryPart = ""; + if (!getVariantsXOr().isEmpty()) { + StringJoiner sj = new StringJoiner("&"); + for (String key : getVariantsXOr().keySet()) { + sj.add(key + "=" + getVariantsXOr().get(key)); + } + queryPart = sj.toString(); + } + return new URI(isUsingReference() ? SCHEME_A2_REFERENCE : SCHEME_A2, null, base.toString(), queryPart, + null); } else { throw new UnsupportedOperationException("Unsupported scheme " + baseUri.getScheme()); } @@ -128,6 +138,10 @@ public class FsA2Source extends AbstractProvisioningSource implements A2Source { } } + protected Map getVariantsXOr() { + return variantsXOr; + } + // public static void main(String[] args) { // if (args.length == 0) // throw new IllegalArgumentException("Usage: "); -- 2.30.2